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`的核心方法有四个:`onPreExecute()`、`doInBackground()`、`onProgressUpdate()`和`onPostExecute()`。其中: - `onPreExecute()`在后台任务执行前调用,通常用于初始化操作,如设置进度条可见。 - `...
在创建一个带有进度条的下载列表时,我们需要将RecyclerView的灵活性和自定义视图的能力结合起来。下面我们将详细探讨如何实现这个功能。 首先,我们要创建一个自定义的View来表示下载进度条。这个自定义View可以...
最近项目中要做一个带进度条的上传文件的功能,学习了AsyncTask,使用起来比较方便,将几个方法实现就行,另外做了一个很简单的demo,希望能对大家有帮助,在程序中设好文件路径和服务器IP即可。 demo运行截图: ...
总之,"带有进度条的Button"是一种实用的设计,它将交互性和反馈性相结合,使得用户能够更好地理解应用程序的状态。通过学习和实践这样的案例,开发者可以提升自己的Android UI设计和定制能力。
这个源码项目("带有进度条的button")提供了实现这一功能的具体代码,对于开发者来说,这是一个学习和参考的好资源。从提供的文件名来看,可能包含有源码的详细说明和更多优质源码的链接,这可以帮助开发者深入理解...
在Android开发中,实现带有进度条的下载功能是一项常见的需求,尤其在用户需要等待资源(如图片、视频或文件)加载时,进度条可以提供良好的用户体验。本示例主要涉及两个关键知识点:网络图片的下载和进度条的显示...
【标题】"带有进度条的button.zip"是一个包含源代码示例的压缩包,它提供了一个独特的用户界面组件,即一个按钮(Button)与进度条(Progress Bar)相结合的功能。这种设计常见于需要用户等待某些操作完成的应用场景...
可能使用了自定义的drawable资源,如shape和layer-list,来构造出带有进度条效果的背景。 5. **Java与Kotlin**: 资源可能是用Java或Kotlin编写的。Kotlin是现代Android开发的首选语言,它提供了更简洁的语法和一些...
对于"带刻度进度条"的需求,我们可以选择使用SeekBar,因为它本身带有滑动手柄,用户可以通过拖动来改变进度,更符合刻度进度条的交互方式。 1. **SeekBar的基本使用** - 在XML布局文件中添加SeekBar: ```xml ...
在Android开发中,创建一个带有进度条的Button可以提供用户更好的交互体验,特别是在进行网络请求或者数据处理时,用户能够直观地看到操作的进度。这个压缩包“安卓Andriod源码——带有进度条的button.zip”很可能...
一个`AsyncTask`实例有四个主要阶段:`onPreExecute()`、`doInBackground(Params...)`、`onProgressUpdate(Progress...)`和`onPostExecute(Result)`。 - `onPreExecute()`:在主线程中执行,通常用于初始化任务,如...
在Android开发中,创建一个带有进度条的Button是常见的需求,尤其在用户执行长时间操作时,如上传或下载文件,为了提供更好的用户体验,通常会在按钮上添加一个加载进度条来显示任务进度。这个"Android应用源码之带...
这个"安卓多线程下载的demo"提供了一个实现断点续传并带有进度条功能的示例,非常适合直接集成到实际项目中。下面我们将深入探讨这个知识点。 首先,多线程下载是指将一个大文件分割成多个小部分,每个部分在一个...
本文将详细讲解如何创建一个带有进度条的ProgressDialog,并通过一个名为"TestProgressDialog01"的示例项目进行演示。 首先,ProgressDialog有两种主要类型:indeterminate(不确定)和determinate(确定)。...
这个"安卓Android源码——带有进度条的button.rar"就是一个很好的示例,它展示了如何在Android应用中实现一个带有进度条的按钮组件。下面我们将深入探讨这一主题。 1. **自定义View组件** 在Android中,为了实现...
在Android开发中,我们可以使用`AsyncTask`或`IntentService`配合`ProgressDialog`或自定义`ProgressBar`来实现下载进度条的功能。`AsyncTask`用于在后台执行下载任务,而`ProgressDialog`或自定义`ProgressBar`则...
在Android开发中,创建一个带有进度条的下载功能是一项常见的任务,这有助于用户直观地了解文件下载的状态。本文将详细讲解如何实现这样一个功能,主要涉及的技术点包括Android的异步处理、文件IO操作以及UI更新。 ...
在Android应用开发中,创建一个带有进度条的Button是一个常见的需求,这通常用于表示某个操作正在进行,如上传、下载或加载数据。这个"Android应用源码之带有进度条的button"示例是一个很好的学习资源,它涵盖了...