开始活动时不受欢迎的延迟

时间:2013-03-27 00:12:22

标签: android bitmap imagebutton

我正在使用一些Acitivity,它运作良好。但我有一个奇怪的延迟。

我明白了,这是关于代码的这一部分,我将存储的图像加载到SD卡中。

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

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

如何解决?

如果我取消此代码,一切都按照我的意愿行事。

2 个答案:

答案 0 :(得分:5)

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

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

here你可以找到关于如何使用AsyncTask加载它们的好信息。

这是他们向你展示的方法(你甚至可以download the sample!)

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);
    }
}

答案 1 :(得分: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) {
          }
    }