AsyncTask

Google 为了方便我们在子线程中更新UI,提供了AsyncTask ,背后实现原理也是基于异步消息机制。

主要用来处理后台耗时操作,并将数据更新到主线程的一个工具类。

AsyncTask的生命周期和它所在的Activity的生命周期是不一致的,也就是说你关闭所在Activity,AsyncTask不一定停止。

AsyncTask是一个抽象类,如果我们想要使用它,必须创建一个子类去继承它。

public class DownLoadAsyncTask extends AsyncTask<Void, Integer, Boolean> {
  ......
}

继承时我们需要指定三个泛型参数,这三个参数的用途为:

1.Params: 执行AsyncTask时,需要传入的参数,

2.Progress: 后台执行任务时的返回参数类型,也就是 publishProgress() 方法的参数类型

3.Result: 当后台任务执行完毕后的任务,也就是 doInBackground()方法的返回值类型

需要重写的几个方法:

1.onPreExecute()

这个方法在后台任务开始执行前调用,进行一些界面上的初始化操作,比如显示一个进度条对话框。

2.doInBackground(Params ... values)

这个方法为必须实例化的抽象方法,这个方法的所有代码都会在子线程中执行,用来处理耗时操作。

不可以进行UI操作

3.onProgressUpdate()

当在后台任务中调用了 publishProgrss(Progress ..)方法时,这个方法会被调用,这个方法一般用来更新UI。

4.onPostExecut)()

当后台任务执行结束并通过return语句进行返回时调用,一般会进行UI操作,比如根据返回结果来提示是否操作成功。

<u>注意:</u>

AsyncTask默认使用 AsyncTask.SERIAL_EXECUTOR 执行异步线程,也就是说都是按照顺序一个个的执行。

如果需要并行的执行多个AsyncTask对象,需要通过

downLoadAsyncTask.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR);

简单使用:

new AsyncTask<String, Void, List<News>>() {
    @Override
    protected List<News> doInBackground(String... params) {

        //子线程中执行逻辑
        String data=NetUtils.readStream(NetUtils.getData(params[0]));
        return NetUtils.decodeNewsJson(data);
    }

    @Override
    protected void onPostExecute(List<News> newses) {
        //UI线程中执行逻辑
        listView.setAdapter(new NewsAdapter(AsyncActivity.this, newses));
        super.onPostExecute(newses);
    }
}.execute( path);
Last modification:July 12th, 2020 at 07:53 pm