Android AsyncTask 使用

1,229 阅读2分钟

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

AsyncTask 使用

  private class MyTask extends AsyncTask{
      @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 { ... }

如果不需要参数请使用 Void

  private class MyTask extends AsyncTask { ... }
  • 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 asyncTask = new AsyncTask() {
        //耗时的操作
        @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();

  }

示例代码