AsyncTask
AsyncTask是专门用于完成非UI线程更新UI线程的任务.本质上还是开启新线程执行耗时操作,并将结果返回给UI线程
Asy是一个抽象类,其中有五个主要的方法
* 五个主要方法*
1.onPreExecute() 开启耗时操作前的准备工作
2.doInBackground(String[] params) 耗时操作,此处运行于后台线程池
返回值是onPostExecute的参数值,其中运行 publishProgress(i)方法,此方法会异步调用onProgressUpdate()方法。
3.onProgressUpdate(Integer[] values)更改进度显示
4onPostExecute(String o)最终结果显示
Note:这里有三个参数,第一个参数对应doInBackground放的参数,第二个对应onPregressUpdate的参数,第三个对应OnPostExecute
class MyAsyncTask extends AsyncTask
package com.example.mythread;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
* Created by 杜春慧 on 2016/4/21.
*/
public class AsyncTaskActivity extends AppCompatActivity {
//先写一个异步内部类 有三个参数,注意每个参数的含义
//必须重写doInBackground方法,返回值是onPostExecute的参数值。所有耗时操作写在这里,参数类型是一个数组
//类里面的第一个参数是doInbackground里面的
private ProgressBar progressBar;
private TextView textView1;
private MyAsyncTask asyncTask;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_asynctask);
progressBar = (ProgressBar) findViewById(R.id.progress);
textView1 = (TextView) findViewById(R.id.text);
//必须在主线程中调用AsyncTask,用execute方法
asyncTask=new MyAsyncTask();
asyncTask.execute();
}
public class MyAsyncTask extends AsyncTask<String, Integer, String> {
//重写四个方法 理解每个方法的作用和返回值
@Override
protected String doInBackground(String... params) {
//这个方法里面写耗时操作
int i = 0;
while (i < 100) {
i++;
publishProgress(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "下载完成";
}
@Override
protected void onPreExecute() {
//AsyncTask启动时的准备工作
super.onPreExecute();
Log.d("准备工作", Thread.currentThread().getName());
// textView.setText("开始下载");
}
@Override
protected void onPostExecute(String s) {
//这个方法的参数值是doInbackground的返回值
textView1.setText(s);
}
@Override
protected void onProgressUpdate(Integer... values) {
//更新时的方法
textView1.setText("正在下载:"+values[0]+"%");
progressBar.setProgress(values[0]);
}
}
}