可交互的AsyncTask

内网一个牛人写的,感觉挺好,原生的AsyncTask把业务逻辑和UI展示的逻辑都掺和到了一起,这个哥们弄了几个接口,进行了拆分。

public interface IJob{
    public boolean isCancelled();
    public void cancelJob(boolean interrupt);
}
public interface IUiCallback<Result>{
    public void onPreExecute();
    public void onPostExecute(Result result);
    public void onProgressUpdate(Integer... values);
    public void onCancelled();
}
public interface IBusinessCallback<Result>{
    public Result onBusinessLogic(IJob job, Object... params);
}

为了简化调用,派生出两个子类:

public abstract class IBusinessSimpleCallback<Result> implements IBusinessCallback<Result>{

	public Result onBusinessLogic(IJob job, Object... params){
		Result result = doBusinessLogic(job, params);
		if(job.isCancelled()){
			return null;
		}else {
			return result;
		}
	}

	public abstract Result doBusinessLogic(IJob job, Object... params);
}
public abstract class IUiSimpleCallback<Result> implements IUiCallback<Result>{

	@Override
	public void onPreExecute() {
	}

	@Override
	public void onProgressUpdate(Integer... values) {
	}

	@Override
	public void onCancelled() {
	}
}

这样,UI回调可以只关注onPostExecute,业务回调在cancel之后返回null。

核心类:

public class JobAsyncTask<Result> extends AsyncTask<Object, Integer, Result> implements IJob {

    private IUiCallback<Result> mUiCallback;
    private IBusinessCallback<Result> mBizCallback;

    public JobAsyncTask(IBusinessCallback<Result> bizCallback, IUiCallback<Result> uiCallback){
        mUiCallback = uiCallback;
        mBizCallback = bizCallback;
    }

    @Override
    protected Result doInBackground(Object... params){
        return mBizCallback.onBusinessLogic(this, params);
    }

    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        mUiCallback.onPreExecute();
    }

    @Override
	protected void onPostExecute(Result result) {
		super.onPostExecute(result);
		mUiCallback.onPostExecute(result);
	}

	@Override
	protected void onProgressUpdate(Integer... values) {
		super.onProgressUpdate(values);
		mUiCallback.onProgressUpdate(values);
	}

	@Override
	public void cancelJob(boolean interrupt) {
		this.cancel(interrupt);
	}
}

把AsyncTask生命周期事件分别对应到UI回调和业务回调。

public class ConcurrentMgr {

	public static <Result> IJob submitJob(IBusinessCallback<Result> bizCallback, IUiCallback<Result> uiCallback, Object... params){
        JobAsyncTask<Result> job = new JobAsyncTask<Result>(bizCallback, uiCallback);
        return (IJob)job.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    }

}

这里还是使用了AsyncTask的线程池,话说executeOnExecutor()竟然可以返回AsyncTask本身,这个比较有用!

现在来看一下,我们的业务组件该如何来写:

public class BusinessLogic {

	public <Result> IJob doSomeBusiness(IUiCallback<Result> uiCallback, final Object someParam){
		IBusinessCallback<Result> bizCallback = new IBusinessSimpleCallback<Result>(){
            @Override
            public Result doBusinessLogic(IJob job, Object... params){
                // do your business here.
            	int num = (Integer)someParam;
            	List<String> list = new ArrayList<String>();
            	for(int i=0;i<num;i++){
            		try{
                		Thread.sleep(500);
                	}catch(Exception e){}
            		list.add("str"+i);
            	}
            	return (Result)list;
            }
        };
        return ConcurrentMgr.submitJob(bizCallback, uiCallback, someParam);
    }

}

我在这里仅仅是生成了2个字符串,然后返回出去。在Activity中可以这样调用:

btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				IUiCallback<List<String>> mUiCallback = new IUiSimpleCallback<List<String>>(){
					@Override
					public void onPostExecute(List<String> result) {
						if(result != null){
							for(String str : result){
								Log.e("test", str);
								Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
							}
						}
					}
				};
				IJob mJob = new BusinessLogic().doSomeBusiness(mUiCallback,2);
				try{
					Thread.sleep(500);
				}catch(Exception e){
					e.printStackTrace();
				}
				// mJob.cancelJob(true);
			}
		});

最后,为了让Acitivity销毁时能自动停止job,可以在onDestroy()中cancel任务:

@Override
public void onDestroy(){
    	if(null != mJob) {
		mJob.cancel(true);
	}
}

上面可以看出来,代码很干净整洁,完美地进行了分层,非常的优雅!

时间: 2024-11-07 04:30:19

可交互的AsyncTask的相关文章

Android异步任务AsyncTask的使用与原理分析

在上一篇文章<Android缓存机制&一个缓存框架推荐>中说到,在了解了Android缓存机制后我准备自己动手写一个LruCache和DiskLruCache二级缓存的轻量级的图片请求框架,在思考如何搭建这个框架时,纠结于用何种方式去下载图片,是直接new出一个线程呢,还是用看起来稍微高大上档次一点的AsyncTask异步任务来处理?思来想去,还是虚荣心作怪,还是用AsyncTask吧,正好这个工具类我之前用的也比较少,对它的原理也不是很清楚,趁这个机会,好好学一下AsyncTask的

Android 开发笔记 “线程交互(Handler+Thread 和 AsyncTask)”

为什么需要线程 假设需要开发一个联网应用程序,需要从一个网址抓取网页内容,这里读取的网页地址是笔者在本地机器上自己建立的服务器地址.当然在读取网页内容的时候,可以使用HttpClient提供的API,但是这并不是本文的介绍重点.缺乏联网程序开发经验的程序员可能写出下面的代码. package com.ophone.network; //这里为了节省篇幅,忽略了import项 public class NetworkActivity extends Activity { // 显示任务的执行状态和

异步交互 asynctask的用法;

class myAysncTask extends AsyncTask<String, Integer, String>{ @Override protected String doInBackground(String... params) { // TODO Auto-generated method stub String ss=params[0]; String st=NewWorkUtil.httpClient_Post(ss); return st; } @Override pro

异步任务 AsyncTask

注:转载注明出处 异步任务:用于解决线程之间的数据传递(UI线程不能完成耗时操作,由子线程完成) AsyncTask异步任务执行流程: 1 继承AsyncTask类 参数:parmas   progress  result class MyAsyncTask extends AsyncTask<String, Integer, Integer>{ 重写3个方法 A: protected void onPreExecute(){ 耗时操作之前的准备工作(主线程) super.onPreExecu

[转]Android:异步处理之AsyncTask的应用(二)

2014-11-07     既然UI老人家都这么忙了,我们这些开发者肯定不能不识趣的去添乱阻塞UI线程什么的,否则UI界面万一停止响应了呢——这不是招骂的节奏么?!所以我们知道用Handler+Thread的方法,在子线程中处理耗时的任务,任务完成后通过Handler通知UI主线程更新UI界面,皆大欢喜有木有. 可是这样,还是有某些人觉得用Handler+Thread的代码会比较繁琐,当然这个某些人里面包括我们伟大的谷歌.所以AsyncTask(异步任务)在Android 1.5中横空出世:相

Android网络(3):HttpClient作客户端,Tomcat Servlet作服务器的交互示例

前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后台服务器用Eclipse的JavaEE版最好的,但单就Tomcat来说(不写jsp之类的),本文下面的服务器方面操作在普通版的Eclipse也是可以的.我这里为了和ADT-bundle分开,特意重新安个JavaEE版的Eclipse.] 1.下载Eclipse的Tomcat插件:http://www

你真的理解了AsyncTask吗?

在Android应用开发的过程中,我们需要时刻注意保证应用程序的稳定和UI操作响应及时,因为不稳定或响应缓慢的应用将给应用带来不好的印象, 严重的用户卸载你的APP,这样你的努力就没有体现的价值了.本文试图从AsnycTask的作用说起,进一步的讲解一下内部的实现机制.如果有一些开发经验的人, 读完之后应该对使用AsnycTask过程中的一些问题豁然开朗,开发经验不丰富的也可以从中找到使用过程中的注意点. 为何引入AsnyncTask? 在Android程序开始运行的时候会单独启动一个进程,默认

Android之——AsyncTask随笔

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46945263 在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行.在单线程模型中始终要记住两条法则: 1. 不要阻塞UI线程 2. 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事

OSChina客户端源码学习(1)--Android与Server的交互

这里主要针对"综合"这个选项卡下的"资讯"模块为例子,对核心代码进行解读. 准备工作:参考我的另外一篇博客 http://blog.csdn.net/csp277/article/details/46610893 然后点击下面的类 Class AsyncHttpResponseHandler 第一步:定义AsyncHttpResponseHandler,该handler对象将作为Http请求的参数 protected AsyncHttpResponseHandler