博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个android 异步多线程类介绍
阅读量:2350 次
发布时间:2019-05-10

本文共 6799 字,大约阅读时间需要 22 分钟。

public interface AsyncWorkIF {    public Object excute(Map
map);    }public class AsyncWorkHandler extends Handler implements AsyncWorkIF{                  private static Looper sLooper = null;           private WorkerHandler mWorkerHanler ;              protected final class WorkerArgs{        Handler handler;           Map
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
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
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
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
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
()); //开始执行,进行调用excute得到热点信息bean,然后通过基类的机制,发给handleMessage(Message msg)处理。

 

转载地址:http://colvb.baihongyu.com/

你可能感兴趣的文章
快速识别图片类型
查看>>
理解云原生
查看>>
docker常见问题答疑
查看>>
mac最简配置maven
查看>>
虚拟机性能监控与故障处理工具
查看>>
GIT的一些操作
查看>>
ZooKeeper 四字命令
查看>>
Mysql InnoDB锁问题
查看>>
ZooKeeper编程 基础教程
查看>>
Java 集合框架
查看>>
kafka 操作
查看>>
Java 集合框架 算法
查看>>
Java 集合框架 Set实现
查看>>
Java 集合框架 List实现
查看>>
Java 集合框架 Map 实现
查看>>
kafka 简单入门
查看>>
maven常用命令汇总
查看>>
Redis 方案
查看>>
ZooKeeper 数据与存储配置
查看>>
ZooKeeper 安装部署
查看>>