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 实现 进度条 网络下载进度条 例子
AsyncTask 网络加载图片及进度条的加载示例
AsyncTask与Handler实现进度条的方式
Android Async异步操作实例---加载网络图片,实现进度条的更新
这篇文章给大家介绍Android使用AsyncTask下载图片并显示进度条功能。 AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练! public class AsyncTaskActivity2 extends Activity { private Button ...
主要讲AsyncTask一些主要方法的使用和有关进度条的一个简单例子,对应我的博客《Android专题之AsyncTask(三)异步方法操作之进度条》,有问题欢迎留言讨论。。。
AsyncTask (API level 3,所以几乎所有目前在市面上流通的 Android 版本皆可使用) 是除 Thread 外的另一种选择,Android 团队鼓励主执行绪(UI thread) 专注于操作 & 画面的流畅呈现, 其余工作 (如网络资料传输、...
Handler与AsyncTask使用示例,Handler AsyncTask 示例 looper
AsyncTask是个不错的东西,可以使用它来做下载进度条。代码讲解如下: package com.example.downloadfile; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net....
异步处理进度条 有代码注解~适合初学者~
onProgressUpdate 在doInBackground()方法中调用publishProgress()方法是怎么工作的,AsyncTask加载网络图片展示了doInBackground onPreExecute onPostExecute的工作顺序,模拟进度条更新展示了onProgressUpdate怎么...
Android AsyncTask异步处理下载网页
Android Asynctask 先小试牛刀,了解一下各个方法执行过程,关注博客http://himici.com/
http://blog.csdn.net/yx0628/article/details/10054851 这个是AsyncTask异步上传文件我的博文。 很简单的小demo,在android端程序中把文件路径和服务器IP改成自己的就行。
利用android.os.AsyncTask类完成MP3下载,采用进度条动态显示下载的百分比。是学习AsyncTask不错的例子。
AsyncTask 断点下载
使用AsyncTask实现文件下载,可以控制暂停和继续,并且在状态栏中显示下载的进度 使用AsyncTask实现文件下载,可以控制暂停和继续,并且在状态栏中显示下载的进度