Android编程权威指南(第26章 Looper、Handler和HandlerThread)

本章节接25章
一、配置RecyclerView以显示图片

1.更新PhotoHolder(PhotoGalleryFragment.java)

private class PhotoHolder extends RecyclerView.ViewHolder {
        private ~~TextView mTitleTextView~~  ImageView mItemImageView;
        
        public PhotoHolder(View itemView) {
            super(itemView);
            ~~mTitleTextView = (TextView) itemView;~~ 
            mItemImageView = (ImageView) itemView.findViewById(R.id.item_image_view);
        }
        ~~public void bindGalleryItem(GalleryItem item) {
            mTitleTextView.setText(item.toString());
        }~~ 
        public void bindDrawable(Drawable drawable) {
            mItemImageView.setImageDrawable(drawable);
        }
    }

在这里插入图片描述
2.更新PhotoAdapter的onCreateViewHolder方法(PhotoGalleryFragment.java)

    ~~private class PhotoAdapter extends RecyclerView.Adapter<PhotoHolder> {

        private List<GalleryItem> mGalleryItems;

        public PhotoAdapter(List<GalleryItem> galleryItems) {
            mGalleryItems = galleryItems;
        }

        @Override
        public PhotoHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
            TextView textView = new TextView(getActivity());
            return new PhotoHolder(textView);~~ 
            LayoutInflater inflater = LayoutInflater.from(getActivity());
            View view = inflater.inflate(R.layout.list_item_gallery, viewGroup, false);
            return new PhotoHolder(view);
        }

在这里插入图片描述
3.绑定默认图片(PhotoGalleryFragment.java)

       public void onBindViewHolder(PhotoHolder photoHolder, int position) {
            GalleryItem galleryItem = mGalleryItems.get(position);
            ~~photoHolder.bindGalleryItem(galleryItem);~~ 
            Drawable placeholder = getResources().getDrawable(R.drawable.bill_up_close);
            photoHolder.bindDrawable(placeholder);

在这里插入图片描述

二、创建并启动后台线程

1.初始线程代码(ThumbnailDownloader.java)

public class ThumbnailDownloader<T> extends HandlerThread {
    private static final String TAG = "ThumbnailDownloader";
    
    private boolean mHasQuit = false;
    
  public ThumbnailDownloader() {
      super(TAG);
  }  
  @Override
  public boolean quit() {
      mHasQuit = true;
      return super.quit();
  }
  public void queueThumbnail(T target,String url) {
      log.i(TAG,"Got a URL:" + url);
  }

在这里插入图片描述
2.创建ThumbnailDownloader(PhotoGalleryFragment.java)

~~public class PhotoGalleryFragment extends Fragment {
    private static final String TAG = "PhotoGalleryFragment";
    private RecyclerView mPhotoRecyclerView;
    private List<GalleryItem> mItems = new ArrayList<>();~~ 
    private ThumbnailDownloader<PhotoHolder> mThumbnailDownloader;
 ~~public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
        new FetchItemsTask().execute();~~ 
        mThumbnailDownloader = new ThumbnailDownloader<>();
        mThumbnailDownloader.start();
        mThumbnailDownloader.getLooper();
        Log.i(TAG, "Background thread started");
 ~~public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {~~ 
    @Override
    public void onDestroy() {
        super.onDestroy();
        mThumbnailDownloader.quit();
        Log.i(TAG, "Background thread destroyed");
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3.让ThumbnailDownloader跑起来(PhotoGalleryFragment.java)

        ~~public void onBindViewHolder(PhotoHolder photoHolder, int position) {
            GalleryItem galleryItem = mGalleryItems.get(position);
            Drawable placeholder = getResources().getDrawable(R.drawable.bill_up_close);
            photoHolder.bindDrawable(placeholder);~~ 
            mThumbnailDownloader.queueThumbnail(photoHolder, galleryItem.getUrl());
        }

在这里插入图片描述
4.添加一些常量和成员变量(ThumbnailDownloader.java)

    ~~private static final String TAG = "ThumbnailDownloader";~~ 
    private static final int MESSAGE_DOWNLOAD = 0;
    private boolean mHasQuit = false;
    private Handler mRequestHandler;
    private ConcurrentMap<T,String> mRequestMap = new ConcurrentHashMap<>();

在这里插入图片描述
5.获取和发送消息(ThumbnailDownloader.java)

    ~~public void queueThumbnail(T target, String url) {
        Log.i(TAG, "Got a URL: " + url);~~ 

        if (url == null) {
            mRequestMap.remove(target);
        } else {
            mRequestMap.put(target, url);
            mRequestHandler.obtainMessage(MESSAGE_DOWNLOAD, target)
                    .sendToTarget();
        }

在这里插入图片描述
6.处理消息(ThumbnailDownloader.java)

   @Override
    protected void onLooperPrepared() {
        mRequestHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == MESSAGE_DOWNLOAD) {
                    T target = (T) msg.obj;
                    Log.i(TAG, "Got a request for URL: " + mRequestMap.get(target));
                    handleRequest(target);
                }
            }
        };
    }

    private void handleRequest(final T target) {
        try {
            final String url = mRequestMap.get(target);

            if (url == null) {
                return;
            }

            byte[] bitmapBytes = new FlickrFetchr().getUrlBytes(url);
            final Bitmap bitmap = BitmapFactory
                    .decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
            Log.i(TAG, "Bitmap created");
               } catch (IOException ioe) {
            Log.e(TAG, "Error downloading image", ioe);

在这里插入图片描述
在这里插入图片描述
7.传递Handler的处理消息(ThumbnailDownloader.java)

 ~~private ConcurrentMap<T,String> mRequestMap = new ConcurrentHashMap<>();~~ 
    private Handler mResponseHandler;
    private ThumbnailDownloadListener<T> mThumbnailDownloadListener;

    public interface ThumbnailDownloadListener<T> {
        void onThumbnailDownloaded(T target, Bitmap bitmap);
    }

    public void setThumbnailDownloadListener(ThumbnailDownloadListener<T> listener) {
        mThumbnailDownloadListener = listener;
    }
        ~~public ThumbnailDownloader(Handler responseHandler) {
        super(TAG);~~ 
        mResponseHandler = responseHandler;

在这里插入图片描述
8.使用反馈Handler(PhotoGalleryFragment.java)

Handler responseHandler = new Handler();
        mThumbnailDownloader = new ThumbnailDownloader<>(responseHandler);
        mThumbnailDownloader.setThumbnailDownloadListener(
            new ThumbnailDownloader.ThumbnailDownloadListener<PhotoHolder>() {
                @Override
                public void onThumbnailDownloaded(PhotoHolder photoHolder, Bitmap bitmap) {
                    Drawable drawable = new BitmapDrawable(getResources(), bitmap);
                    photoHolder.bindDrawable(drawable);
                }
            }
        );

在这里插入图片描述
9.图片下载与显示(ThumbnailDownloader.java)

           mResponseHandler.post(new Runnable() {
                public void run() {
                    if (mRequestMap.get(target) != url ||
                            mHasQuit) {
                        return;
                    }

                    mRequestMap.remove(target);
                    mThumbnailDownloadListener.onThumbnailDownloaded(target, bitmap);
                }
            });

在这里插入图片描述
10.添加清理方法(ThumbnailDownloader.java)

    public void clearQueue() {
        mRequestHandler.removeMessages(MESSAGE_DOWNLOAD);
        mRequestMap.clear();
    }

在这里插入图片描述
11.调用清理方法(PhotoGalleryFragment.java)

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mThumbnailDownloader.clearQueue();
    }

在这里插入图片描述

三、运行

可能是网址原因,所以无法访问出照片
有兴趣的话,可以自己解决。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值