今天的任务为创建并启动后台线程,代码如下:
ThumbnailDownloader.java:
包 com.bignerdranch.android.photogallery ; 导入 android.graphics.Bitmap ; 导入 android.graphics.BitmapFactory ; 导入 android.os.Handler ; 导入 android.os.HandlerThread ; 导入 android.os.Message ; 导入 android.util.Log ; import java.io.IOException ; import java.util.concurrent.ConcurrentHashMap ; import java.util.concurrent.ConcurrentMap ; 公共类 ThumbnailDownloader <T> 扩展了 HandlerThread { private static final String TAG = “ThumbnailDownloader” ; private static final int MESSAGE_DOWNLOAD = 0 ; private boolean mHasQuit = false; 私人处理程序mRequestHandler ; private ConcurrentMap <T , String> mRequestMap = new ConcurrentHashMap <>(); 私人处理程序mResponseHandler ; private ThumbnailDownloadListener <T> mThumbnailDownloadListener ; 公共接口 ThumbnailDownloadListener <T> { void onThumbnailDownloaded(T target , Bitmap bitmap); } public void setThumbnailDownloadListener(ThumbnailDownloadListener <T> listener){ mThumbnailDownloadListener = listener ; } public ThumbnailDownloader(Handler responseHandler){ super(TAG); mResponseHandler = responseHandler ; } @覆盖 保护无效 onLooperPrepared(){ mRequestHandler = new Handler(){ @覆盖 public void handleMessage(Message msg){ if(msg.what == MESSAGE_DOWNLOAD){ T target =(T)msg.obj ; Log.i(TAG ,“请求URL:” + mRequestMap.get(target)); handleRequest(target); } } } ; } @覆盖 public boolean quit(){ mHasQuit = true; return super .quit(); } public void queueThumbnail(T target , String url){ Log.i(TAG ,“有网址:” + url); if(url == null){ mRequestMap.remove(target); } else { mRequestMap.put(target , url); mRequestHandler.obtainMessage(MESSAGE_DOWNLOAD , target) .sendToTarget(); } } public void clearQueue(){ mRequestHandler.removeMessages(MESSAGE_DOWNLOAD); mRequestMap.clear(); } private void handleRequest(final T target){ try { final String url = mRequestMap.get(target); 如果(url == null){ return; } byte [] bitmapBytes = new FlickrFetchr()。getUrlBytes(url); 最终的位图位图= BitmapFactory .decodeByteArray(bitmapBytes ,0 , bitmapBytes.length); Log.i(TAG ,“创建位图”); mResponseHandler.post(new Runnable(){ public void run(){ if(mRequestMap.get(target)!= url || mHasQuit){ 返回; } mRequestMap.remove(target); mThumbnailDownloadListener.onThumbnailDownloaded(target , bitmap); } }); } catch(IOException ioe){ Log.e(标签,“下载图片时出错” , ioe); } } }