一个android 异步多线程类介绍

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)处理。
    	


 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值