`

AsyncTask使用和带有进度条的下载

 
阅读更多

 

 

 1 AsyncTask 用来执行比较耗时的异步任务,默认同时开启N个任务,则按顺序执行,需要并发则需要特殊设置

 2 AsyncTask中泛型的三个参数:

*  第一个参数:传入doInBackground()方法的参数类型 ,下载任务通常传Url地址

*  第二个参数:传入onProgressUpdate()方法的参数类型,通过publishProgress每次将数据传入 onProgressUpdate,更新进度 

*  第三个参数:传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型

3 使用: 1)创建一个子类实现AsyncTask  2)实例化这个类并且调用execute 方法 

4 进度的使用:  要在doInBackground方法中不断把执行进度传递出来(调用publishProgress),才能显示进度 

 

下面一段网页下载代码实例:

1 Activity 中

  

public class AsyncTaskTestActivity extends Activity implements OnClickListener {

	private Button btn;
	private TextView message;
	private EditText url ; 
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_asynctask);
		btn = (Button) findViewById(R.id.start);
		btn.setOnClickListener(this);

		message = (TextView) findViewById(R.id.message);
		url = (EditText) findViewById(R.id.url);
		
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		case R.id.start:
			String urlStr = url.getText().toString(); 
			PageTask task = new PageTask(this);
			task.execute( urlStr);
			
			break;
		default:
			break;
		}
	}
	
	/**
	 *  第一个参数:传入doInBackground()方法的参数类型 ,下载任务通常传Url地址
	 *  第二个参数:传入onProgressUpdate()方法的参数类型,通过publishProgress每次将数据传入 onProgressUpdate,更新进度 
	 *  第三个参数:传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型
	 *  
	 * @author root
	 *
	 */
	class PageTask extends AsyncTask<String, Integer, String> {
		// 可变长的输入参数,与AsyncTask.exucute()对应
		ProgressDialog pdialog;

		public PageTask(Context context) {
			pdialog = new ProgressDialog(context, 0);
			pdialog.setButton("cancel", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int i) {
					dialog.cancel();
				}
			});
			pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
				public void onCancel(DialogInterface dialog) {
					finish();
				}
			});
			pdialog.setCancelable(true);
			pdialog.setMax(100);
			pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			pdialog.show();

		}

		 /**
		  * 异步执行的耗时处理 
		  */
		@Override
		protected String doInBackground(String... params) {

			try {

				HttpClient client = new DefaultHttpClient();
				// params[0]代表连接的url
				HttpGet get = new HttpGet(params[0]);
				HttpResponse response = client.execute(get);
				HttpEntity entity = response.getEntity();
				long length = entity.getContentLength();
				InputStream is = entity.getContent();
				String s = null;
				if (is != null) {
					ByteArrayOutputStream baos = new ByteArrayOutputStream();
					byte[] buf = new byte[128];
					int ch = -1;
					int count = 0;

					while ((ch = is.read(buf)) != -1) {

						baos.write(buf, 0, ch);
						count += ch;
						if (length > 0) {
							// 如果知道响应的长度,调用publishProgress()更新进度
							publishProgress((int) ((count / (float) length) * 100));
						}
						// 让线程休眠100ms
						Thread.sleep(100);
					}
					s = new String(baos.toByteArray());
				}
				// 返回结果
				return s;
			} catch (Exception e) {
				e.printStackTrace();

			}

			return null;

		}

		@Override
		protected void onCancelled() {
			super.onCancelled();
		}
		//异步执行完毕(doInBackground执行完毕,将最终结果传到UI线程中),这个方法被UI线程调用,更新UI线程
		//参数result为doInBackground返回的参数 
		@Override
		protected void onPostExecute(String result) {
			// 返回HTML页面的内容
			message.setText(result);
			pdialog.dismiss();
		}
		//任务执行之前,UI线程调用,做一些准备工作,如显示进度条
		@Override
		protected void onPreExecute() {
			// 任务启动,可以在这里显示一个对话框,这里简单处理
			message.setText("任务开始");
		}
		
		//更新UI线程的进度 
		@Override
		protected void onProgressUpdate(Integer... values) {
			// 更新进度
			System.out.println("" + values[0]);
			message.setText("" + values[0]);
			pdialog.setProgress(values[0]);
		}

	}

}

 2 xml 

  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/message"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="hello world" />
    <EditText
        android:id="@+id/url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:hint="填写下载的URL"
        android:text="http://www.fortunechina.com/business/c/2015-07/21/content_244458.htm" />
    
    <Button android:id="@+id/start"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始下载"/>

</LinearLayout>

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics