Android 图片视图使应用变慢
Android image view makes the app slow
在我的应用程序中,我有一个 ImageView
。在添加 ImageView
之前,该应用程序运行流畅。现在 它抛出 ANR。
图像以 base 64 编码字符串形式保存在数据库中,解码为位图并加载到 imageview 使用:
imageView.setImageBitmap(bitmap);
bitmap
的转换并将 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();
decodedStrings[1] 包含 base64 编码的图像 dataUrl。
这个问题有什么解决方案吗?
让您的应用变慢的主要问题是 WeakReference 将其删除并尝试不使用它
不要使用这个
private final WeakReference<ImageView> imageViewReference;
只需使用
private final ImageView imageViewReference;
使用以下代码压缩图片(75%压缩)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 75, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);
在我的应用程序中,我有一个 ImageView
。在添加 ImageView
之前,该应用程序运行流畅。现在 它抛出 ANR。
图像以 base 64 编码字符串形式保存在数据库中,解码为位图并加载到 imageview 使用:
imageView.setImageBitmap(bitmap);
bitmap
的转换并将 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();
decodedStrings[1] 包含 base64 编码的图像 dataUrl。
这个问题有什么解决方案吗?
让您的应用变慢的主要问题是 WeakReference 将其删除并尝试不使用它
不要使用这个
private final WeakReference<ImageView> imageViewReference;
只需使用
private final ImageView imageViewReference;
使用以下代码压缩图片(75%压缩)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.JPEG, 75, baos);
byte[] imageBytes = baos.toByteArray();
String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);