Thread+Handler更新UI的方法,每个任务都要创建一个线程,线程开销大
Android引入了AsyncTask(轻量级的异步任务类)实现异步操作,更新UI
AsyncTask用到的三种泛型参数:
Params:用于AsyncTask执行任务的参数类型 ,启动任务执行的输入参数,比如HTTP请求URL
Progress:在后台线程处理的过程中,可以阶段性地发布结果的数据类型(后台任务执行的百分比)
Result:任务全部完成后所返回的数据类型(后台执行任务最终返回的结果)
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params...p),在此方法中实现任务的,执行工作,比如连网获取数据.
实现onPostExecute(Result r)方法,应用程序关心的结果在此方法中返回
AsyncTask一定要在主线程中创建实例
我们只需要去实现AsyncTask中的回调方法,在任务的执行过程中,这些方法会被系统自动调用
1.onPreExecute()
作用:当任务执行之前开始调用此方法
2.doInBackground(Params...)
作用:在后台线程执行,执行耗时操作,在执行过程中可以调用publicProgress(Progress..)来更新
任务的进度.publicProgress()相当于Handler.sendmessage()方法
3.onProgressUpdate(Progress...)
作用:此方法在主线程执行,用于显示任务执行的进度
4.onPostExecute(Result);

Android引入了AsyncTask(轻量级的异步任务类)实现异步操作,更新UI
AsyncTask用到的三种泛型参数:
Params:用于AsyncTask执行任务的参数类型 ,启动任务执行的输入参数,比如HTTP请求URL
Progress:在后台线程处理的过程中,可以阶段性地发布结果的数据类型(后台任务执行的百分比)
Result:任务全部完成后所返回的数据类型(后台执行任务最终返回的结果)
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params...p),在此方法中实现任务的,执行工作,比如连网获取数据.
实现onPostExecute(Result r)方法,应用程序关心的结果在此方法中返回
AsyncTask一定要在主线程中创建实例
我们只需要去实现AsyncTask中的回调方法,在任务的执行过程中,这些方法会被系统自动调用
1.onPreExecute()
作用:当任务执行之前开始调用此方法
2.doInBackground(Params...)
作用:在后台线程执行,执行耗时操作,在执行过程中可以调用publicProgress(Progress..)来更新
任务的进度.publicProgress()相当于Handler.sendmessage()方法
3.onProgressUpdate(Progress...)
作用:此方法在主线程执行,用于显示任务执行的进度
4.onPostExecute(Result);
作用:此方法在主线程执行,任务执行的结果作为此方法的参数返回
public class MainActivity extends AppCompatActivity {
private TextView tv;
private Button download;
private ProgressBar pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView)findViewById(R.id.textView);
download = (Button)findViewById(R.id.download);
pb = (ProgressBar)findViewById(R.id.progressBar);
download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//1)创建对象
MyAsyncTask myAsyncTask = new MyAsyncTask();
//2)执行任务
myAsyncTask.execute("begin");
}
});
}
private class MyAsyncTask extends AsyncTask<String,Integer,String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
tv.setText("开始下载");
}
//更新UI
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
pb.setProgress(values[0]);
if(values[0]<100)
tv.setText("progress="+values[0]+"%");
}
//执行耗时操作
@Override
protected String doInBackground(String... params) {
for(int i=0; i<100; i++){
//向onProgressUpdate发送消息
publishProgress(i+1);
try{
Thread.sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}
return "download finished";
}
//doInBackground结束后,执行本方法,result是doInBackground方法
//返回的数据
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
tv.setText(result);
}
}
}