除了使用Handler去更新UI组件,还可以使用异步任务AsyncTask,也是一个好用的方法
AsyncTask是一个抽象类,通常用于被继承,如:
class DownloadTask extends AsyncTask<Params,Progress,Result>
三个参数的含义:
Progress:任务完成的进度值类型
Result: 任务完成后的返回值类型
AsyncTask需要实现的方法:
doInBackground()、onProgressUpdate()、onPreExecute()、onPostExecute()
doInBackground(Params...):会自己去开启一个后台新线程用于执行后台耗时操作,在此方法中可使用publishProgress()去更新任务进度,任务完成后会将该方法的返回值传给onPostExecute(Result result)
onProgressUpdate(Progress values): 更新任务的进度
onPreExecute():后台耗时任务操作执行前调用,用于任务执行的一些初始化工作,如界面的初始化
onPostExecute(): doInBackground()方法执行完后执行该方法,doInBackground()的返回值传给这个方法
用AsyncTask实现下载实例代码如下:
public class MainActivity extends Activity {
private TextView show;
private Button downloadBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (TextView) findViewById(R.id.show);
downloadBtn = (Button) findViewById(R.id.download);
downloadBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DownloadTask task = new DownloadTask(MainActivity.this);
try {
task.execute(new URL("http://blog.youkuaiyun.com/csdn_blog_lcl/article/details/52739018"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
});
}
class DownloadTask extends AsyncTask<URL,Integer,String>{
private Context contex;
private int hasRead = 0;
private ProgressDialog progressDialog;
public DownloadTask(Context context){
this.contex = context;
}
// 该方法开启后台新线程,用来执行耗时任务
@Override
protected String doInBackground(URL... params) {
StringBuffer sb = new StringBuffer();
try {
URLConnection conn = params[0].openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
conn.connect();
String line ="";
while((line=br.readLine()) != null){
sb.append(line+"\n");
hasRead++;
publishProgress(hasRead); //更新任务进度,onProgressUpdate方法会被触发
Thread.sleep(100);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
// 执行耗时操作前调用,执行任务的准备工作,如初始化界面
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(contex);
progressDialog.setTitle("任务执行中");
progressDialog.setMessage("任务正在执行,请稍等");
progressDialog.setIndeterminate(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(306);
progressDialog.setCancelable(false);
progressDialog.show();
}
// doInBackground方法的返回值会传给onPostExecute
@Override
protected void onPostExecute(String s) { //任务执行完后将返回值传给了这个方法
super.onPostExecute(s);
show.setText(s); // 更新UI组件
progressDialog.dismiss();
}
@Override
protected void onProgressUpdate(Integer... values) { // 更新进度
super.onProgressUpdate(values);
show.setText("已读取"+values[0]+"行");
progressDialog.setProgress(values[0]);
}
}
}