Android 에서 AsyncTask 를 사용 하여 그림 을 불 러 오 는 작업 절차

그림 불 러 오기 기본 동작
1.AsyncTask 하위 클래스 만 들 기
  • ImageView 의 약 한 인용 을 구성원 변수 로 설정 하고 구조 함 수 를 만들어 ImageView 대상 에 전달 합 니 다.
  • 지정 한 크기 로 Bitmap 를 분석 하 는 방법 을 호출 합 니 다.
  • 약 한 인용 이기 때문에 인용 이 회수 되 었 는 지 판단 해 야 한다.비동기 작업 이 완료 되 기 전에 사용자 가 Activity 를 떠 나 거나 설정 이 바 뀌 면 ImageView 도 존재 하지 않 을 수 있 습 니 다.
  • 
    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);
          }
        }
      }
    }
    2.비동기 작업 인 스 턴 스 대상 을 만 들 고 실행 을 시작 합 니 다.
    
    public void loadBitmap(int resId, ImageView imageView) {
      BitmapWorkerTask task = new BitmapWorkerTask(imageView);
      task.execute(resId);
    }
    처리 병발
    ListView 와 GridView 재 활용 서브 레이아웃 때문에 비동기 작업 이 완료 되 었 을 때 관련 레이아웃 이 회수 되 지 않 았 습 니 다.비동기 임무 수행 시간의 선후 도 장담 할 수 없다.병발 사건 을 처리 해 야 합 니 다.
    1.BitmapDrawable 하위 클래스 만 들 기
    비트 맵 과 그 에 대응 하 는 비동기 작업 을 저장 하 는 데 사 용 됩 니 다.
    
    static class AsyncDrawable extends BitmapDrawable {
      private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;
      public AsyncDrawable(Resources res, Bitmap bitmap,
          BitmapWorkerTask bitmapWorkerTask) {
        super(res, bitmap);
        bitmapWorkerTaskReference =
          new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
      }
      public BitmapWorkerTask getBitmapWorkerTask() {
        return bitmapWorkerTaskReference.get();
      }
    }
    2.귀속 AsyncDrawable
    AsyncDrawable 을 만 들 고 BitmapWorkerTask 대상 에 전송 합 니 다.imageView 는 이 AsyncDrawable 로 설정 하고 비동기 작업 을 시작 합 니 다.
    
    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);
      }
    }
    cancelPotentialWork 이 방법 은 호출 방법 으로 컨트롤 에 대응 하 는 비동기 작업 을 가 져 와 현재 작업 과 일치 하 는 지 판단 하 는 데 사 용 됩 니 다.
    
    public static boolean cancelPotentialWork(int data, ImageView imageView) {
      final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);
      if (bitmapWorkerTask != null) {
        final int bitmapData = bitmapWorkerTask.data;
        // If bitmapData is not yet set or it differs from the new data
        if (bitmapData == 0 || bitmapData != data) {
          // Cancel previous task
          bitmapWorkerTask.cancel(true);
        } else {
          // The same work is already in progress
          return false;
        }
      }
      // No task associated with the ImageView, or an existing task was cancelled
      return true;
    }
    이 getBitmapWorkerTask()방법 은 비동기 작업 에 대응 하 는 그림 을 가 져 오 는 데 사 용 됩 니 다.
    
    private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {
      if (imageView != null) {
        final Drawable drawable = imageView.getDrawable();
        if (drawable instanceof AsyncDrawable) {
          final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
          return asyncDrawable.getBitmapWorkerTask();
        }
      }
      return null;
    }
    총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.더 많은 내용 을 알 고 싶다 면 아래 링크 를 보 세 요.

    좋은 웹페이지 즐겨찾기