上篇介绍了AsyncTask的用途及基本用法,这篇我会以实际代码来解释AsyncTask的用法。
这次做的是如何使用异步任务下载网络资源,该实例的界面布局很简单,只包含两个组件:一个文本框用于显示从网络下载的页面代码;一个按钮用于激发下载任务。
先给出xml中控件的代码。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.xiaoxuedong.asyntaskdemo1.MainActivity" >
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="textview" />
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下载"
android:onClick="click"/>
</LinearLayout>
只有两个控件,一个TextView,一个Button。而且只有一个Activity类
public class MainActivity extends Activity {
private TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1=(TextView) findViewById(R.id.tv1);
}
public void click(View v) throws MalformedURLException{
switch (v.getId()) {
case R.id.btn1:
DownTask task=new DownTask(this);
task.execute(new URL("http://blog.csdn.net/xiaoxuedong123/article/details/53364948"));
break;
}
}
// public void download(View source) throws MalformedURLException{
// DownTask task=new DownTask(this);
// task.execute(new URL("http://www.crazyit.org/ethos.php"));
// }
class DownTask extends AsyncTask<URL, Integer, String>{
//可变长的输入参数,与AsyncTask.exucute()对应
ProgressDialog pdialog;
// 定义记录已经读取行的数量
int hasRead=0;
Context mContext;
public DownTask(Context ctx){
mContext=ctx;
}
@Override
protected String doInBackground(URL... params) {
StringBuilder sb=new StringBuilder();
try {
URLConnection conn=params[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++;
publishProgress(hasRead);
}
return sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
//返回HTML页面的内容
tv1.setText(result);
pdialog.dismiss();
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
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) {
// 跟新进度
tv1.setText("已经读取了【"+values[0]+"】行");
pdialog.setProgress(values[0]);
}
}
}
首先需要声明实例化我所定义的两个控件,由于Button属性里面有onclick方法,所以不需要再去实例化这个按钮,这里的异步主要是由一个内部类来继承AsyncTask这个抽象类。现在我来简单的说明一下
AsyncTask里面的方法的作用。
(1)dolnBackground():该方法的代码完成实际的下载任务。
(2)onPreExecute():该方法的代码负责在下载开始的时候显示一个进度条。
(3)onProgressUpdate():该方法的代码负责随着下载进度的改变跟新进度条的进度值。
(4)onPostExecute():该方法的代码负责当下载完成后,将下载的代码显示出来。
除此之外,本程序需要访问网络,因此还需要在AndroidManifest.xml 文件中声明如下权限:<uses-permission android:name="android.permission.INTERNET"/>。
至于关于设置对话框的一系列属性都已经在代码中添加了注释,这就不一一说明了。实现的效果如下:
执行之前:
执行中,所下载的进度
执行后,所获取的String型数据