【发布时间】:2019-01-24 03:42:03
【问题描述】:
第一次加载 ImagePager 时,有时 Picasso 会调用 onError,显示 .error 可绘制对象。如果我按下后退按钮并返回具有 ImagePager 的 Activity,毕加索会正确加载图片。如果 ImagePager 有两张或更多图片并且我在图片之间滑动,则这些图片会在某些时候正确加载而无需退出并重新进入 ImagePager。
它可以正确地从网络上下载其他图像。当我尝试从托管公司服务器下载时出现问题。
我正在使用 Picasso 'com.squareup.picasso:picasso:2.5.0'。
我也提到了下面的问题,但它没有帮助。
First time error loading picture with Picasso
下面是我的 MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
configureToolbar(R.string.select_task);
init();
}
@Override
protected void init() {
//TODO: For QA Testing Purpose, Remove after Testing
mWidthField =findViewById(R.id.edt_txt_1);
mHeightField =findViewById(R.id.edt_txt_2);
mImage=findViewById(R.id.image_view_2);
mImageLoadButton=findViewById(R.id.image_load_button);
item=new Item();
item.setPrimaryImageURL("https://cdn.cnn.com/cnnnext/dam/assets/190119161516-01-trump-government-shutdown-0119-exlarge-169.jpg");
item.setUpc("0001111086751");
Log.d("ImageManager","Main Activity");
new ImageManager(getApplicationContext()).downloadImage(item.getPrimaryImageURL(),item.getUpc()+".jpeg",imageDownloadedCallBack);
mImageLoadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadResizedImage();
}
});
}
//TODO: For QA Testing Purpose, Remove after Testing
ImageManager.ImageDownloadedCallBack imageDownloadedCallBack=new ImageManager.ImageDownloadedCallBack() {
@Override
public void imageDownloadComplete(final Bitmap bitmap, boolean status) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.d("ImageManager","Image Download CallBack in Main Activity");
mImage.setImageBitmap(bitmap);
}
});
}
};
下面是我的 ImageManager.java
public class ImageManager {
private final Context mContext;
private int mWidth;
private int mHeight;
public ImageManager(Context mContext){
this.mContext=mContext;
}
public interface ImageDownloadedCallBack {
void imageDownloadComplete(Bitmap bitmap,boolean status);
}
private Target picassoImageTarget(Context context, final String imageDir, final String imageName,final ImageDownloadedCallBack imageDownloadedCallBack) {
ContextWrapper cw = new ContextWrapper(context);
final File directory = cw.getDir(imageDir, Context.MODE_PRIVATE); // path to /data/data/yourapp/app_imageDir
return new Target() {
@Override
public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
final File myImageFile = new File(directory, imageName);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(myImageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
Log.d("ImageManager","Image DownLoad CallBack");
imageDownloadedCallBack.imageDownloadComplete(bitmap,true);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
thread.start();
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
Log.d("ImageManager","Bitmap Failure");
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
if (placeHolderDrawable != null) {}
}
};
}
public void downloadImage(String url, String id,ImageDownloadedCallBack imageDownloadedCallBack){
// this.imageDownloadedCallBack=imageDownloadedCallBack;
Log.d("ImageManager","Download Image function");
Picasso.with(mContext).load(url).into(picassoImageTarget(mContext,"imageDir", id ,imageDownloadedCallBack));
}
}
任何帮助将不胜感激。
【问题讨论】:
-
可能是因为图片太大了。
-
我尝试过使用不同尺寸的不同图像。但无论图像大小如何,我仍然有同样的问题。
-
还有一个原因是托管图像的 PC 速度很慢或与它的连接速度很慢。
标签: java android multithreading picasso