Android AsyncTask 使用

作者: CoderMiner | 来源:发表于2016-11-03 15:16 被阅读318次

Android AsyncTask 使用

题图 www.gratisography.com

在Android中在UI线程中做耗时操作时,会引起UI线程的阻塞,出现UI界面的卡顿线程,有时还会引起ANR等异常情况
在Android中的耗时操作推荐通过异步操作来避免阻塞UI线程,AsyncTask是Android中提供的一个异步操作的框架,
另外在Android中还有ThreadHandlerAsyncTask适用于耗时比较小的操作,如果是需要一个线程长时间在
后台运行,请参考使用 Executor ThreadPoolExecutor FutureTask

AsyncTask 使用

private class MyTask extends AsyncTask<String,Integer,String>{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... params) {
        String myString = params[0];

        int i = 0;
        publishProgress(i);

        return "Result";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }
}
new MyTask().execute("my string paramaters");//调用并执行

AsyncTask的参数说明

一般的使用的方法

private class MyTask extends AsyncTask<Params, Progress, Result> { ... }

如果不需要参数请使用 Void

private class MyTask extends AsyncTask<Void, Void, Void> { ... }
  • Params,这个参数就是在调用时,传递过来的参数
  • Progress,耗时操作在后台执行的进度
  • Result,后台操作完成之后,返回的结果
参数的关系

方法说明

  • onPreExecute(),这个方法中可以更新UI,在耗时操作执行之前的操作
  • doInBackground(String... params),这个是主要的方法,所有的耗时的操作需要在这个方法中处理,
    在这个方法中可以调用 publishProgress(Progress...)方法来更新操作的进度
  • onProgressUpdate(Integer... values),在上一部中调用 publishProgress(Progress...)方法之后触发,在UI线程中执行
    可以给用户操作的进度的显示(如 进度条)
  • onPostExecute(String result),在耗时操作完成之后,触发这个方法,在UI线程中执行,可以通知用户操作已经完成

使用示例

加载本地图库的照片,并通过GridView显示,核心代码

private void loadAlbum(){
  AsyncTask<Void, Void, Void> asyncTask = new AsyncTask<Void, Void, Void>() {
      //耗时的操作
      @Override
      protected Void doInBackground(Void... params) {
          Cursor  c = getContext().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                  new String[]{MediaStore.Images.ImageColumns.DATA},null,null, MediaStore.Images.ImageColumns.DATE_TAKEN+" desc ");
          if(null != c && c.getCount() > 0 && c.moveToFirst()){
              while (c.moveToNext()){
                  mData.add(c.getString(c.getColumnIndex(MediaStore.Images.ImageColumns.DATA)));
              }
          }
          return null;
      }
      //耗时操作完成之后,调用这个方法,更新UI
      @Override
      protected void onPostExecute(Void aVoid) {
          loadData();
      }
  };

  asyncTask.execute();

}

示例代码

相关文章

网友评论

    本文标题:Android AsyncTask 使用

    本文链接:https://www.haomeiwen.com/subject/fhzbuttx.html