onStart()
メソッドでpicassoを使用してサーバーから画像をロードし、写真が完全にダウンロードされるまで進行状況バーを表示したいのですが、私のコードは次のとおりです。
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
Picasso.with(context).load(imageLoad)
.placeholder(R.id.progressBarDetails)
.error(R.drawable.friend_request).noFade().resize(200, 200)
.into(avatarImage, new Callback() {
@Override
public void onError() {
// TODO Auto-generated method stub
}
@Override
public void onSuccess() {
// TODO Auto-generated method stub
progressbar.setVisibility(View.GONE);
}
});
Picasso.with(this).load(imageLoad).into(target);
}
OnFinished a = new OnFinished() {
@Override
public void onSendFinished(IntentSender IntentSender, Intent intent,
int resultCode, String resultData, Bundle resultExtras) {
// TODO Auto-generated method stub
intent = new Intent(getApplicationContext(), Map.class);
}
};
private Target target = new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
new Thread(new Runnable() {
@Override
public void run() {
File file = new File(Environment
.getExternalStorageDirectory().getPath()
+ "/actress_wallpaper.jpg");
try {
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 75, ostream);
ostream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
私はあなたのコードをテストしていませんが、それが機能する場合でも、ファイル_actress_wallpaper.jpg
_はImageViewにロードされません。ドキュメントでは、それは言う
このクラスを実装するオブジェクトには、内部で適切なストレージを確保するために、
Object.equals(Object)
およびObject.hashCode()
の実装が必要です。
これを試して:
_File file = new File(pathToFile);
Picasso.with(context)
.load(file)
.into(imageView, new Callback() {
@Override
public void onSuccess() {
progressbar.setVisibility(View.GONE);
}
});
_
コードをテストしていないことに注意してください。
更新:
バージョン2.3.2と2.3.3を試しましたが、問題があるようです https://github.com/square/picasso/issues/539
これは古い質問ですが、サーバーから画像を読み込んでいるときにプログレスバーを表示する際に問題が発生したため、この回答が他の人に役立つ可能性があります。
Picasso 2.4.0を使用しています。そして、私はピカソ ターゲット インターフェイスを使用して、imageviewに画像をロードしています。テスト済みで動作するコードは次のとおりです。
最初に次の行を追加します。
ImageView ivPhoto = (ImageView) findViewById(R.id.iv_photo);
ProgressBar pbLoadingBar = (ProgressBar) findViewById(R.id.pb_loading_bar);
//get image url
String imageUrl = getImageUrl();
//ImageViewTarget is the implementation of Target interface.
//code for this ImageViewTarget is in the end
Target target = new ImageViewTarget(ivPhoto, pbLoadingBar);
Picasso.with(mContext)
.load(imageUrl)
.placeholder(R.drawable.place_holder)
.error(R.drawable.error_drawable)
.into(target);
上記で使用したTargetインターフェースの実装を次に示します
private static class ImageViewTarget implements Target {
private WeakReference<ImageView> mImageViewReference;
private WeakReference<ProgressBar> mProgressBarReference;
public ImageViewTarget(ImageView imageView, ProgressBar progressBar) {
this.mImageViewReference = new WeakReference<>(imageView);
this.mProgressBarReference = new WeakReference<>(progressBar);
}
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//you can use this bitmap to load image in image view or save it in image file like the one in the above question.
ImageView imageView = mImageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
ProgressBar progressBar = mProgressBarReference.get();
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
ImageView imageView = mImageViewReference.get();
if (imageView != null) {
imageView.setImageDrawable(errorDrawable);
}
ProgressBar progressBar = mProgressBarReference.get();
if (progressBar != null) {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
ImageView imageView = mImageViewReference.get();
if (imageView != null) {
imageView.setImageDrawable(placeHolderDrawable);
}
ProgressBar progressBar = mProgressBarReference.get();
if (progressBar != null) {
progressBar.setVisibility(View.VISIBLE);
}
}
}
上記のコードは、アクティビティで画像をロードするために使用された場合、正常に機能します。ただし、同じビューホルダーが使用されているgridview/recyclerviewまたはビューページャーなどに画像をロードする場合、 an issue onBitmapLoaded()が呼び出されないことがあります(ビューはリサイクルされ、PicassoとしてTargetオブジェクトへの弱い参照のみを保持します)。この問題を解決するための リンク です。