转载请注明来自于:http://blog.csdn.net/strangenightmare/article/details/52922546
无意间在公司代码中看到前任同事对于AsyncTask类的封装很漂亮。所以自己就尝试模仿了一版。毕竟AsyncTask写起来要好多行,看着并不漂亮。索性封装起来在使用的时候调用一下就可以了。精简代码。
对于AsyncTask我就不多说了,做Android开发的人对于这个类应该是太熟悉不过了。这个类在异步程序使用时简单便捷,过程也可控。但是缺点就是多个异步操作如果对UI有修改时候,就会变得太过于鸡肋。这种情况还是Handler才能游刃有余。具体这一块还是建议大家去多百度吧。我就不班门弄斧了,毕竟我也是菜鸟-_-||
言归正传,我的封装主要是利用回调机制,将任务的控制交还给主控制类。其实没啥技术含量,纯属自己用着方便,也算自己强化一下回调的使用吧。一共有两个类,一个类是接口类,一个类是Task类。
这个是接口类,里面主要写了AsyncTask常用的4个接口
/**
* Created by xiaonan on 16/10/24.
*/
public interface TaskCallbacker {
void OnPreTask();
String OnBackgroundTask();
void OnUpdateProgress(int progress);
void OnPostTask(Object result);
}
这个是Task类,继承了AsyncTask<String,Integer,String>,具体这三个参数什么意思,可以自行百度
import android.os.AsyncTask;
/**
* Created by xiaonan on 16/10/24.
*/
public class MyTask extends AsyncTask<String,Integer,String> {
private static TaskCallbacker tcb;
public MyTask(TaskCallbacker callbacker){
this.tcb = callbacker;
}
@Override
protected void onPreExecute() {
tcb.OnPreTask();
super.onPreExecute();
}
@Override
protected String doInBackground(String... strings) {
String result = tcb.OnBackgroundTask();
return result;
}
@Override
protected void onProgressUpdate(Integer... values) {
tcb.OnUpdateProgress(values[0]);
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
tcb.OnPostTask(result);
super.onPostExecute(result);
}
}
AsyncTask<String,Integer,String>的这三个参数可以根据你的具体业务去调整,我只是根据自己的需求用了这三个。第一个就是执行execute("start")传入的值得类型;第二个参数是用于更新进度条之类的传入Integer类型;第三个参数是返回值的类型。
关于这个类的调用,我写了以下这个示例。我用一个线程睡眠3秒来模拟网络下载阻塞线程的操作。
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
TestTask();
}
public void TestTask(){
MyTask task = new MyTask(new TaskCallbacker() {
@Override
public void OnPreTask() {
System.out.println("打印一行字,任务开始了");
}
@Override
public String OnBackgroundTask() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "耗时任务执行完毕";
}
@Override
public void OnUpdateProgress(int progress) {
}
@Override
public void OnPostTask(Object result) {
System.out.println(result);
tv.setText("任务执行完毕");
}
});
task.execute("start");
}
}
如果大家有什么建议,欢迎给我发私信留言。我不定期会上来看哒!!