AsyncTask介绍 Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。 首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。

Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。

AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

AsyncTask定义了三种泛型类型 Params,Progress和Result。

  • Params 启动任务执行的输入参数,比如HTTP请求的URL。
  • Progress 后台任务执行的百分比。
  • Result 后台执行任务最终返回的结果,比如String。

使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

  • doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
  • onPostExecute(Result) 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

有必要的话你还得重写以下这三个方法,但不是必须的:

  • onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
  • onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
  • onCancelled() 用户调用取消时,要做的操作

使用AsyncTask类,以下是几条必须遵守的准则:

  • Task的实例必须在UI thread中创建;
  • execute方法必须在UI thread中调用;
  • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
  • 该task只能被执行一次,否则多次调用时将会出现异常;

下面来看一个简单的例子:

首先定义一个回调接口

public interface ResponseListener<T> {    // TODO: More args    public void onPostExecute(T result);}

定义异步类

public class AsyncTaskTest extends AsyncTask<Object,Object,String> {    ResponseListener<String> mResponseListener;    public AsyncTaskTest(ResponseListener<String> mResponseListener) {        super();        this.mResponseListener = mResponseListener;    }    @Override    protected String doInBackground(Object[] params) {        try{            Thread.sleep(5000);            return  "test:ok";        }        catch (InterruptedException e)        {        }        return "";    }    @Override    protected void onPostExecute(String o) {        mResponseListener.onPostExecute(o);        super.onPostExecute(o);    }}

调用异步方法的页面

public class MainActivity extends ActionBarActivity implements  ResponseListener<String> {    private TextView mTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextView=(TextView)findViewById(R.id.textView1);        new AsyncTaskTest(this).execute();    }    @Override    public void onPostExecute(String result) {        mTextView.setText(result);    }}

Android异步任务AsyncTask_第1张图片

更多相关文章

  1. Android Studio打包生成Jar包的方法(亲测可用)
  2. Android更新UI的方法
  3. Eclipse中编译Android工程时出现的问题解决方法。
  4. Android studio获取证书指纹 (SHA1)的方法
  5. Android 解析XML文件方法
  6. Android 的实现TextView中文字链接的4种方法

随机推荐

  1. android 获取sd卡根目录
  2. 防止Android点击按钮过快造成多次事件实
  3. 直播源码用Glide框架缓存压缩图片做一个
  4. android Handler内存泄露 kotlin内存泄露
  5. Android点击EditText以外区域隐藏键盘Fra
  6. Android(安卓)全屏显示
  7. android 页面跳转(intent)
  8. Android(安卓)搜索不到蓝牙设备
  9. Android保持屏幕常亮的方法总结
  10. Android(安卓)Bundle类