一个android 异步多线程类介绍
16lz
2021-01-26
public interface AsyncWorkIF { public Object excute(Map<String,String> map); }public class AsyncWorkHandler extends Handler implements AsyncWorkIF{ private static Looper sLooper = null; private WorkerHandler mWorkerHanler ; protected final class WorkerArgs{ Handler handler; Map<String,String> map; } public AsyncWorkHandler(){ synchronized (AsyncQueryHandler.class) { if (sLooper == null) { HandlerThread thread = new HandlerThread("AsyncWorkHandler"); thread.start(); sLooper = thread.getLooper(); } } mWorkerHanler = new WorkerHandler(sLooper); } /** * 获取结果并发送至消息 * @param bean */ public void doWork(Map<String,String> map){ Message msg = mWorkerHanler.obtainMessage(); WorkerArgs workArgs = new WorkerArgs(); workArgs.handler = this; workArgs.map = map; msg.obj = workArgs; mWorkerHanler.sendMessage(msg); } /** * 得到消息,需要重写 */ @Override public void handleMessage(Message msg){} /** * 实际执行方法 */ @Override public Object excute(Map<String, String> map) { return null; } protected class WorkerHandler extends Handler { public WorkerHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { WorkerArgs args = (WorkerArgs) msg.obj; Map<String,String> quest_map = args.map; Object obj = excute(quest_map);//调用excute方法执行某个操作 Message result = args.handler.obtainMessage(); result.obj = obj; result.sendToTarget();//发送消息至目标 } } }基类如上,
注意:
1. AsyncWorkHandler的子类有成员WorkerHandler,新建一个线程来初始化WorkerHandler的looper
2. AsyncWorkHandler的子类通过调用doWork(Map<String,String> map)来启动整个异步操作
3. AsyncWorkHandler的子类将doWork的参数传递到WorkerHandler的handleMessage中,然后WorkerHandler的handleMessage开始调用父类(AsyncWorkHandler的子类)的 Object obj = excute(quest_map); 将结果获取后,再通过result.sendToTarget()传递到父类(AsyncWorkHandler的子类)的HandleMessage函数。
举例:
//初始化信息 AsyncWorkHandler asyncQueryHandler = new AsyncWorkHandler(){ @Override public Object excute(Map<String, String> map) { HotProductBean bean = CacheManager.getInstance().getHostProductBean(); if(bean==null){ bean = ProductAction.getHotProduct(); } return bean; } @Override public void handleMessage(Message msg) { if(msg.obj!=null){ HotProductBean bean = (HotProductBean)msg.obj; if("true".equals(bean.getResult())){ popFileList = bean.getPopFileList(); promFileList = bean.getPromFileList(); int popSize = popFileList.size(); adapter_gallery_center = new IndexImageAdapter(_context,popFileList); adapter_gallery_bottom = new IndexBottomAdapter(_context,promFileList); //初始化5个分页的点,若过多怎么弄? point_count = popSize; for(int i = 0 ; i < point_count ; i++){ View template = inflater.inflate(R.layout.coin, null); gallery_center_point.addView(template); //得到N个点,用于展示几个热点信息的,点图片处于信息下面 } if(gallery_center_point.getChildCount() > 0){ LinearLayout coin_layout = (LinearLayout)gallery_center_point.getChildAt(0); ImageView child_first = (ImageView)coin_layout.getChildAt(0); child_first.setImageResource(R.drawable.index_body_coin2); } gallery_center.setAdapter(adapter_gallery_center);//设置图片适配器 gallery_bottom.setAdapter(adapter_gallery_bottom); gallery_center.setOnItemSelectedListener(osSelectedListener); gallery_bottom.setOnItemSelectedListener(osSelectedListener); removeDialog(Const.PROGRESSBAR_WAIT); _intent.putExtra("status", true); //开启多个线程去拉取图片------begin for(int i = 0; i < popSize; i++){ final String id = popFileList.get(i).getId(); final String image_url = ImageUtil.getPicUrl(popFileList.get(i).getCoverImage(),2); BitmapDownloaderTask task = new BitmapDownloaderTask(image_url){ @Override protected Bitmap doInBackground(String... params) { Bitmap bm = CacheManager.getInstance().getBitmap(id); if(bm==null){ bm = ImageUtil.getBitmap(image_url); } return bm; } @Override protected void onPostExecute(Bitmap bm) { if(isCancelled()){ bm = null; } if(bm!=null){ if(!CacheManager.getInstance().getBitmap_Map().containsKey(id)){ CacheManager.getInstance().putBitmap(id, bm); } adapter_gallery_center.notifyDataSetChanged(); } } }; task.execute(""); } //开启多个线程去拉取图片------end }else{ Toast.makeText(_context, "信息不存在,请选择其它商品查看!", Toast.LENGTH_SHORT).show(); } }else{ Toast.makeText(_context, "网络不稳定,请检查您的网络状态!", Toast.LENGTH_SHORT).show(); } removeDialog(Const.PROGRESSBAR_WAIT); } }; showDialog(Const.PROGRESSBAR_WAIT); asyncQueryHandler.doWork(new HashMap<String,String>()); //开始执行,进行调用excute得到热点信息bean,然后通过基类的机制,发给handleMessage(Message msg)处理。
更多相关文章
- android异步下载图片
- 调用摄像头拍照并显示
- Android上下文Context全解析
- Android实现异步加载
- bindService的注意事项
- android 联系人搜索
- Android(安卓)Uri.getQueryParameter使用注意
- 调用getChildFragmentManager时出现的Bug
- Android(安卓)直接通过JNI访问驱动