1

我正在使用一些 Acitivitys ,它工作得很好。但我有一个奇怪的延迟。

我发现,这是关于这部分代码的,我正在将存储的图像加载到 SDCard 中。

    if(p.getAdress() != null){
    Bitmap bitmap = BitmapFactory.decodeFile(p.getAdress()); 
            new_image.setBackgroundDrawable(null);
            new_image.setImageBitmap(bitmap);
    }

为什么这个简单的代码执行时间太长?

如何解决?

如果我去掉这段代码,一切都会如我所愿。

4

2 回答 2

5

您不应该直接在 UI 线程上加载大型位图。

实际上,可以在此处找到有效加载大型位图的最佳参考。

在这里,您可以找到有关如何使用 AsyncTask 加载它们的好信息。

这是他们在那里向您展示的方法(您甚至可以下载示例!)

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        data = params[0];
        return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}



 public void loadBitmap(int resId, ImageView imageView) {
    if (cancelPotentialWork(resId, imageView)) {
        final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
        final AsyncDrawable asyncDrawable =
                new AsyncDrawable(getResources(), mPlaceHolderBitmap, task);
        imageView.setImageDrawable(asyncDrawable);
        task.execute(resId);
    }
}
于 2013-03-27T00:18:40.973 回答
1

你可以试试这个方法。它可以帮助你

 private class LongOperation extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... params) {
  if(p.getAdress() != null){
    Bitmap bitmap = BitmapFactory.decodeFile(p.getAdress()); 
            new_image.setBackgroundDrawable(null);
            new_image.setImageBitmap(bitmap);
    }

                return "Executed";
          }      

          @Override
          protected void onPostExecute(String result) {

          }

          @Override
          protected void onPreExecute() {
          }

          @Override
          protected void onProgressUpdate(Void... values) {
          }
    }  
于 2013-03-27T00:19:18.773 回答