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{    @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();}

示例代码

更多相关文章

  1. Android里关于EventBus的使用
  2. Android的Message机制(简单小结)
  3. Android的线程使用来更新UI----Thread、Handler、Looper、TimerT
  4. Android(安卓)如何使用GPU硬件加速
  5. Android,谁动了我的内存
  6. Android(安卓)使用html做UI的方法---js与java的相互调用
  7. Android连接Mysql数据库教程以及增删改查
  8. Android(安卓)AsyncTask
  9. 安卓从入门到精通路线图

随机推荐

  1. Android(安卓)Banner图片轮播控件+ViewPa
  2. android ListView 与 ScrollView 共存冲
  3. Android的读写文件权限
  4. sss
  5. Android四:sqllite
  6. Android学习_18_使用事务操作SQLite数据
  7. Android TextView(EditView)文字底部或者中
  8. 全屏显示布局随机图片的显示
  9. 记录app端嵌入式H5页面
  10. 备忘录