1

私はいくつかのAcitivitysで作業しています、それはかなりうまく機能しています。しかし、私はそれに奇妙な遅れがあります。

そして、私はそれがコードのこの部分についてであり、SDカードに保存された画像をロードしていることを理解しています。

    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 に答える