【问题标题】:Android image view makes the app slowAndroid图像视图使应用程序变慢
【发布时间】:2015-04-07 06:41:45
【问题描述】:

在我的应用程序中,我有一个 ImageView。在添加 ImageView 之前,该应用程序运行流畅。现在它会抛出 ANR

图像以 base 64 编码字符串保存在数据库中,并被解码为位图并使用以下方法加载到图像视图:

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。

有解决这个问题的办法吗?

【问题讨论】:

  • 位图的大小是多少?
  • 它可以从 10 kb 到 10 mb 不等

标签: android bitmap android-asynctask imageview base64


【解决方案1】:

让您的应用变慢的主要问题是 WeakReference 删除它并尝试不这样做

不要用这个

 private final WeakReference<ImageView> imageViewReference;

只需使用

private final ImageView imageViewReference;

【讨论】:

【解决方案2】:

使用以下代码压缩图片(75%压缩)

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.JPEG, 75, baos);
        byte[] imageBytes = baos.toByteArray();
       String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多