android AsyncTask基础用法及个人理解(下)

上篇介绍了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型数据




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值