【Android事件处理之使用异步任务执行下载】为了避免UI线程失去响应的问题,Android建议将耗时操作放在新线程中完成。AsyncTask相较于Handler更加轻量级,适用于简单的异步处理。本例示范如何使用异步任务下载网络资源,布局包括一个文本框和一个按钮,当指定一个网页时,程序会下载该网页的源代码,并显示在文本框中,按钮用于激发下载任务。
1.MainActivity代码:
package com.example.asynctask;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.security.ProtectionDomain;
public class MainActivity extends Activity {private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = findViewById(R.id.show);
}
//按钮点击事件
public void download(View view) throws MalformedURLException {
DownTask task = new DownTask(this);
task.execute(new URL("https://www.csdn.net/"));
}
class DownTask extends AsyncTask{
//定义一个进度条
ProgressDialog pdialog;
//定义记录已经读取行的数量
int hasRead = 0;
Context mContext;
public DownTask(Context mContext) {
this.mContext = mContext;
}@Override
protected String doInBackground(URL... urls) {
StringBuilder sb = new StringBuilder();
try{
URLConnection conn = urls[0].openConnection();
//打开conn连接对应的输入流,并将它包装成BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream() , "utf-8"));
String line = null;
while ((line = br.readLine()) != null){
sb.append(line + "\n");
hasRead++;
//该方法是doInBackground()里面的方法,用于更新任务的执行进度
publishProgress(hasRead);
}
return sb.toString();
}catch (Exception e){
e.printStackTrace();
}
return null;
}@Override
protected void onPostExecute(String s) {
//当doInBackground()方法执行完成之后,系统会自动调用onPostExecute()方法
//并将doInBackground()方法的返回值传给该方法
//返回HTML页面的内容
show.setText(s);
pdialog.dismiss();
}@Override
protected void onPreExecute() {
pdialog = new ProgressDialog(mContext);
pdialog.setTitle("下载任务");
pdialog.setMessage("任务正在执行中,请稍等...");
pdialog.setCancelable(false);
pdialog.setMax(202);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pdialog.setIndeterminate(false);
pdialog.show();
}@Override
protected void onProgressUpdate(Integer... values) {
//更新进度
show.setText("已经读取了【" + values[0] + "】 行 ");
pdialog.setProgress(values[0]);
}
}
}
2.XML代码:
3.由于获取网上资源属于联网操作,所以需要在AndroidManifest.xml中添加
最后执行。