zoukankan      html  css  js  c++  java
  • AsyncTask函数化的封装,AsyncTask函数式的调用

    AsyncTask在本专栏已经做过详细的解析,但是AsyncTask函数式的调用这个概念对大多数人来说比较陌生。其实本质就是自己封装AsyncTask,让暴露的方法,看不到一点AsyncTask的身影。

    今天就讲讲对AsyncTask封装的过程。

    新建一个AsyncTaskUtils类:

    public class AsyncTaskUtils {
    	public static <T> void doAsync(final IDataCallBack<T> callBack) {
    		new AsyncTask<Void, Void, T>() {
    
    			protected void onPreExecute() {
    				callBack.onTaskBefore();
    			};
    
    			@Override
    			protected T doInBackground(Void... params) {
    				// TODO
    				return callBack.onTasking(params);
    			}
    
    			protected void onPostExecute(T result) {
    				callBack.onTaskAfter(result);
    			};
    
    		}.execute();
    	}
    }

    在doAsync中匿名类的方式重写AsyncTask,然后要在对应的方法中使用接口回调的方式,把工具类里面的这三个功能传递出去(不同的模块进行传值,考虑使用接口回调)。调用接口中三个功能相同的方法(实际调用实现类的方法)。执行doInBackground返回值用泛型指定。

    对应的接口如下:

    public interface IDataCallBack<T> {
    	/**任务执行之前*/
    	void onTaskBefore();
    
    	/**任务执行中...*/
    	T onTasking(Void... params);
    
    	/**任务执行之后*/
    	void onTaskAfter(T result);
    
    }
    
    onTasking是对应doInBackground方法来的,因此要有返回值,使用泛型指定。

    定义一个活动的基类BaseActivity:

    public class BaseActivity extends Activity {
    
    	public <T> void doAsync(IDataCallBack<T> callBack) {
    		AsyncTaskUtils.doAsync(callBack);
    	}
    
    }

    在一个活动中,要想执行耗时操作。就可以继承自BaseActivity。例如下面,点击按钮执行访问网络。就重写doAsync。里面的接口实现方法,就类似xUtils工具类里面的HttpUtils的使用差不多。这样只需要关心

    /**任务执行之前*/
    	void onTaskBefore();
    
    	/**任务执行中...*/
    	T onTasking(Void... params);
    
    	/**任务执行之后*/
    	void onTaskAfter(T result);
    

    三个实现类方法就好了。AsyncTask就通过函数调用的方式来完成了操作。

    public class MainActivity extends BaseActivity {
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		findViewById(R.id.btn2).setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				MainActivity.this.doAsync(new IDataCallBack<String>() {//该耗时操作,返回值类型是一个String类型
    
    					@Override
    					public void onTaskBefore() {
    					}
    
    					@Override
    					public String onTasking(Void... params) {//耗时的具体操作
    						String result = "";
    						try {
    							DefaultHttpClient httpClient = new DefaultHttpClient();
    							HttpGet get = new HttpGet("http://www.baidu.com");
    							HttpResponse response = httpClient.execute(get);
    							if (response.getStatusLine().getStatusCode() == 200) {
    								result = EntityUtils.toString(response.getEntity());
    							}
    						} catch (Exception e) {
    							// TODO Auto-generated catch block
    							e.printStackTrace();
    						}
    						return result;
    					}
    
    					@Override
    					public void onTaskAfter(String result) {
    						System.out.println(result);
    					}
    				});
    			}
    		});
       }
    
    运行结果,发现可以正常使用~

    AsyncTask函数化的封装,AsyncTask函数式的调用 就讲完了。

    喜欢我的朋友可以关注我哦~

    也可以扫描下方的二维码,或搜索公众号  Android程序员开发指南  去微信每日阅读一篇安卓开发文章。


    长按上方二维码,关注本公众号一起交流Android开发技术。



  • 相关阅读:
    递归和this指向
    作用域,闭包
    三种存储方式
    事件流,冒泡,捕获,事件委托
    centos添加登陆成功提示消息
    centos7下安装oracle11g R2报错
    linux下从home分区扩展到根分区
    linux下搭建mongodb副本集
    linux服务下使用nginx之后数据导出超时
    linux下搭建git服务器
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299498.html
Copyright © 2011-2022 走看看