在我的应用程序中,我有一个ImageView.在添加该ImageView之前,该应用程序运行平稳.现在它会抛出ANR.
图像以base 64编码字符串形式保存在数据库中,并使用以下代码解码为位图并加载到imageview中:
imageView.setImageBitmap(bitmap);
位图的转换以及将位图应用于ImageView的所有这些操作都是在AsyncTask中完成的:
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
private String data = "";
public BitmapWorkerTask(ImageView imageView, String data) {
imageViewReference = new WeakReference<ImageView>(imageView);
this.data = data;
}
@Override
protected Bitmap doInBackground(Integer... params) {
byte[] decodedString = Base64.decode(data, Base64.DEFAULT);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inPurgeable = true;
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length, options);
return decodedByte;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
使用以下代码从主ui调用AsyncTask:
BitmapWorkerTask task = new BitmapWorkerTask(pollWebView,decodedStrings[1]);
task.execute();
encodedStrings [1]包含base64编码的图像dataUrl.
这个问题有什么解决办法吗?
解决方法:
让您的应用变慢的主要问题是WeakReference删除它,然后尝试
不要用这个
private final WeakReference<ImageView> imageViewReference;
只是使用
private final ImageView imageViewReference;