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);    }}

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android Q 显示系统(一) VSync
  5. Android自带音频均衡器MusicFx分析
  6. Android解析WindowManagerService(一)WMS的诞生
  7. android电源管理之框架分析
  8. Android中JNI的使用方法
  9. Android(安卓)LayoutInflater的获取及inflate()参数和返回值

随机推荐

  1. android emulator 配置_
  2. 安卓编程小tips
  3. Android(安卓)Jetpack架构组件Navigation
  4. Android高仿网易新闻客户端之动态添加标
  5. Android(安卓)Bundle类别
  6. Android(安卓)ImageView控件的MaxWidth、
  7. Android有效解决加载大图片时内存溢出的
  8. android检查网络连接状态的变化,无网络时
  9. Introducing Quick Search Box for Andro
  10. Android(安卓)Studio svn检出项目一直报