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