`

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>

 

 

分享到:
评论

相关推荐

    AsyncTask网络图片和进度条的加载

    `AsyncTask`的核心方法有四个:`onPreExecute()`、`doInBackground()`、`onProgressUpdate()`和`onPostExecute()`。其中: - `onPreExecute()`在后台任务执行前调用,通常用于初始化操作,如设置进度条可见。 - `...

    recyclerView实现带进度条下载列表

    在创建一个带有进度条的下载列表时,我们需要将RecyclerView的灵活性和自定义视图的能力结合起来。下面我们将详细探讨如何实现这个功能。 首先,我们要创建一个自定义的View来表示下载进度条。这个自定义View可以...

    Android带进度条的文件上传示例(使用AsyncTask异步任务)

    最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。 demo运行截图: ...

    带有进度条的Button

    总之,"带有进度条的Button"是一种实用的设计,它将交互性和反馈性相结合,使得用户能够更好地理解应用程序的状态。通过学习和实践这样的案例,开发者可以提升自己的Android UI设计和定制能力。

    带有进度条的button

    这个源码项目("带有进度条的button")提供了实现这一功能的具体代码,对于开发者来说,这是一个学习和参考的好资源。从提供的文件名来看,可能包含有源码的详细说明和更多优质源码的链接,这可以帮助开发者深入理解...

    android下载带有进度条

    在Android开发中,实现带有进度条的下载功能是一项常见的需求,尤其在用户需要等待资源(如图片、视频或文件)加载时,进度条可以提供良好的用户体验。本示例主要涉及两个关键知识点:网络图片的下载和进度条的显示...

    带有进度条的button.zip

    【标题】"带有进度条的button.zip"是一个包含源代码示例的压缩包,它提供了一个独特的用户界面组件,即一个按钮(Button)与进度条(Progress Bar)相结合的功能。这种设计常见于需要用户等待某些操作完成的应用场景...

    应用源码之带有进度条的button.zip

    可能使用了自定义的drawable资源,如shape和layer-list,来构造出带有进度条效果的背景。 5. **Java与Kotlin**: 资源可能是用Java或Kotlin编写的。Kotlin是现代Android开发的首选语言,它提供了更简洁的语法和一些...

    带刻度进度条

    对于"带刻度进度条"的需求,我们可以选择使用SeekBar,因为它本身带有滑动手柄,用户可以通过拖动来改变进度,更符合刻度进度条的交互方式。 1. **SeekBar的基本使用** - 在XML布局文件中添加SeekBar: ```xml ...

    安卓Andriod源码——带有进度条的button.zip

    在Android开发中,创建一个带有进度条的Button可以提供用户更好的交互体验,特别是在进行网络请求或者数据处理时,用户能够直观地看到操作的进度。这个压缩包“安卓Andriod源码——带有进度条的button.zip”很可能...

    异步任务AsyncTask

    一个`AsyncTask`实例有四个主要阶段:`onPreExecute()`、`doInBackground(Params...)`、`onProgressUpdate(Progress...)`和`onPostExecute(Result)`。 - `onPreExecute()`:在主线程中执行,通常用于初始化任务,如...

    Android应用源码之带有进度条的button.zip

    在Android开发中,创建一个带有进度条的Button是常见的需求,尤其在用户执行长时间操作时,如上传或下载文件,为了提供更好的用户体验,通常会在按钮上添加一个加载进度条来显示任务进度。这个"Android应用源码之带...

    安卓多线程下载的demo,支持断点下载,带进度条,可以直接使用在项目中

    这个"安卓多线程下载的demo"提供了一个实现断点续传并带有进度条功能的示例,非常适合直接集成到实际项目中。下面我们将深入探讨这个知识点。 首先,多线程下载是指将一个大文件分割成多个小部分,每个部分在一个...

    带进度条的ProgressDialog

    本文将详细讲解如何创建一个带有进度条的ProgressDialog,并通过一个名为"TestProgressDialog01"的示例项目进行演示。 首先,ProgressDialog有两种主要类型:indeterminate(不确定)和determinate(确定)。...

    安卓Android源码——带有进度条的button.rar

    这个"安卓Android源码——带有进度条的button.rar"就是一个很好的示例,它展示了如何在Android应用中实现一个带有进度条的按钮组件。下面我们将深入探讨这一主题。 1. **自定义View组件** 在Android中,为了实现...

    下载带进度条记录的demo

    在Android开发中,我们可以使用`AsyncTask`或`IntentService`配合`ProgressDialog`或自定义`ProgressBar`来实现下载进度条的功能。`AsyncTask`用于在后台执行下载任务,而`ProgressDialog`或自定义`ProgressBar`则...

    Android带进度条的下载

    在Android开发中,创建一个带有进度条的下载功能是一项常见的任务,这有助于用户直观地了解文件下载的状态。本文将详细讲解如何实现这样一个功能,主要涉及的技术点包括Android的异步处理、文件IO操作以及UI更新。 ...

    Android应用源码之带有进度条的button-IT计算机-毕业设计.zip

    在Android应用开发中,创建一个带有进度条的Button是一个常见的需求,这通常用于表示某个操作正在进行,如上传、下载或加载数据。这个"Android应用源码之带有进度条的button"示例是一个很好的学习资源,它涵盖了...

Global site tag (gtag.js) - Google Analytics