Android实践Android知识Android技术知识

Android AsyncTask 使用

2016-11-03  本文已影响318人  CoderMiner

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> { ... }
参数的关系

方法说明

使用示例

加载本地图库的照片,并通过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();

}

示例代码

上一篇 下一篇

猜你喜欢

热点阅读