Android_Async Task异步任务
Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(Application Not Responding)异常,所以不能在UI线程中执行耗时操作。AsyncTask<>是一个抽象类,通常被继承,继承时需要指定三个泛型:
AsyncTask<Params, Progress, Result>
Params:
启动任务执行的输入参数的类型
Progress:
后台任务完成的进度值的类型
Result:
后台执行任务完成后返回结果的类型
MainActivity:
public class MainActivity extends Activity {
private TextView show;
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
show=(TextView) findViewById(R.id.textView1);
webView=(WebView) findViewById(R.id.webview);
}
public void download(View source) throws MalformedURLException{
DownTask task=new DownTask(this);
task.execute(new URL("http://www.baidu.com/"));
}
/**
* AsyncTask<Params, Progress, Result>
* Params:
* 启动任务执行的输入参数的类型----请求参数URL
* Progress:
* 后台任务完成的进度值的类型-----Integer
* Result:
* 后台执行任务完成后返回结果的类型----String
*/
class DownTask extends AsyncTask<URL, Integer, String>{
ProgressDialog pdialog;
Context mContext;
int hasRead=0;
public DownTask(Context ctx){
mContext=ctx;
}
/**
* 该方法在执行后台耗时操作前被调用,初始化
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pdialog=new ProgressDialog(mContext);
pdialog.setTitle("异步任务正在执行中");
pdialog.setMessage("任务正在执行中,请耐心等待...");
pdialog.setCancelable(false);
pdialog.setMax(182);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pdialog.setIndeterminate(false);
pdialog.show();
}
/**
* 重写该方法就是后台线程将要完成的任务,该方法可以调用
* publishProgress(Progress.. values)方法更新任务的执行进度。
*
* Params:
* 请求参数
*/
@Override
// TODO Auto-generated method stub
protected String doInBackground(URL... params) {
StringBuilder sb=new StringBuilder();
try {
URLConnection conn=params[0].openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
String line=null;
while ( (line=br.readLine()) !=null) { // 读行
sb.append(line + "\n");
hasRead++;
publishProgress(hasRead); //进度开始为0
}
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* 当doInBackground完成后,系统自动调用 ----执行完后台任务,返回的结果
*/
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
//webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl)
webView.loadDataWithBaseURL(null, result, "text/html", "utf-8", null);
pdialog.dismiss();// 后台任务结束了,取消进度条
}
// 更新进度条----变化的值
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
show.setText("已经读取了 "+values[0]+"行");
pdialog.setProgress(values[0]);
}
}
}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="102dp"
android:text="TextView" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="31dp"
android:text="开始下载"
android:onClick="download"/>
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
注意:别忘了加网络权限
<uses-permission android:name="android.permission.INTERNET" />