AsyncTask

Posted 范仁义

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AsyncTask相关的知识,希望对你有一定的参考价值。

AsyncTask

相当于对handle的封装,可以更方便我们在子线程和主线程中传递数据。

并且因为AsyncTask中采用线程池机制,所以速度比handle快。

AsyncTask写成内部类,我们就可以调用主线程里面的变量,例如后面onProgressUpdate来更新activity就需要主线程里面的变量。

AsyncTask中我们被重写的方法一般三个:onPreExecute、doInBackground、onPostExecute

 

onPreExecute最先被执行,用来加载对话框什么的,提示用户我们下面要进行耗时操作了。

doInBackground我们在这一部分里面执行耗时的操作,比如说网络访问。

onPostExecute在doInBackground方法后面执行,可以用获取到的网络数据更新activity,result参数就是用来传结果数据的。

 

比如现在改变需求:

我们要下载一个很大的东西,比如王者荣耀,所以我们要给用户显示我们的下载进度。

这个时候可以在doInBackground中添加publishProgress方法,publishProgress方法会去调用AsyncTask重写的onProgressUpdate方法,

我们可以在onProgressUpdate方法中去更新进度条。

AsyncTask中的progress参数就是做这个用的。

 1 package com.example.asynctask;
 2 
 3 import android.app.Activity;
 4 import android.os.AsyncTask;
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 import android.widget.TextView;
 8 
 9 public class MainActivity extends Activity {
10     private TextView tv_text;
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         tv_text = (TextView) findViewById(R.id.tv_text);
17         
18         MyAsyncTask task=new  MyAsyncTask();
19         //执行
20         task.execute("www.baidu.com");
21     }
22 
23     class MyAsyncTask extends AsyncTask<String,Integer, String> {
24         /**
25          * 被主线程执行,在doInBackground函数前执行
26          * */
27         @Override
28         protected void onPreExecute() {
29             // 弹加载对话框
30             Log.d("bh", "onPreExecute");
31         }
32 
33         /**
34          * 被子线程执行,用来处理耗时行为
35          * */
36         @Override
37         protected String doInBackground(String... params) {
38             Log.d("bh", "doInBackground:"+params[0]);
39             for(int i=1;i<=100;i++){
40                 try {
41                     Thread.sleep(1000);
42                     //推送当前的进度
43                     publishProgress(i);
44                 } catch (InterruptedException e) {
45                     e.printStackTrace();
46                 }
47             }
48             return null;
49         }
50         @Override
51         protected void onProgressUpdate(Integer... values) {
52             //更新UI上的进度
53             tv_text.setText(values[0]+"");
54         }
55         /**
56          * 被主线程执行,在doInBackground函数后执行
57          * */
58         @Override
59         protected void onPostExecute(String result) {
60             Log.d("bh", "onPostExecute");
61             // 更UI数据
62             tv_text.setText(result);
63         }
64     }
65 }

 

以上是关于AsyncTask的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 Asynctask 未到达 onPostExecute

在 AsyncTask 中将新的 TextView 设置为片段

AsyncTask 和 FragmentManager 的问题

用 Asynctask 更新 FragmentTransaction 替换的片段

从Asynctask ONPostExecute调用片段方法

在 Asynctask 的 onPostExecute() 方法中更改片段