本章节接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();
}
三、运行
可能是网址原因,所以无法访问出照片
有兴趣的话,可以自己解决。