AsyncTask详解 并实现实例-模拟下载
来源:互联网 发布:兴业证券软件优理宝 编辑:程序博客网 时间:2024/06/13 14:10
AsyncTask的三个泛型分别对应的是API中的内容:
简介
Class Overview
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
AsyncTask是更简单的UI线程实现方式。这个类允许后台操作,并允许发布结果到UI线程。而不需要去操作thread和handler
AsyncTask is designed to be a helper class aroundThread
andHandler
and does not constitute a generic threading framework. AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the
java.util.concurrent
package such asExecutor
,ThreadPoolExecutor
andFutureTask
.
AsyncTask实现原理还是Thread和handler,不过谷歌包装好了(那就用呗)。
An asynchronous task is defined by a computation that runs on a background thread andwhose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called
Params
,Progress
andResult
, and 4 steps, calledonPreExecute
,doInBackground
,onProgressUpdate
andonPostExecute
.Params
,Progress
andResult
还有四个步骤:见名思义吧
The 4 steps
When an asynchronous task is executed, the task goes through 4 steps:
onPreExecute()
, invoked on the UI thread before the task is executed. This step is normally used to setup the task, for instance by showing a progress bar in the user interface.doInBackground(Params...)
, invoked on the background thread immediately afteronPreExecute()
finishes executing. This step is used to perform background computation that can take a long time. The parameters of the asynchronous task are passed to this step. The result of the computation must be returned by this step and will be passed back to the last step. This step can also usepublishProgress(Progress...)
to publish one or more units of progress. These values are published on the UI thread, in theonProgressUpdate(Progress...)
step.onProgressUpdate(Progress...)
, invoked on the UI thread after a call topublishProgress(Progress...)
. The timing of the execution is undefined. This method is used to display any form of progress in the user interface while the background computation is still executing. For instance, it can be used to animate a progress bar or show logs in a text field.onPostExecute(Result)
, invoked on the UI thread after the background computation finishes. The result of the background computation is passed to this step as a parameter.千万别忘了在主线程中执行!!!Once created, a task is executed very simply:
new DownloadFilesTask().execute(url1, url2, url3);实例:模拟下载(练手加看个大概)
布局是这个样子的
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"AsyncTask 实际上就是google帮我们封装好的线程UI同步类。通过过修饰handler和Thread类实现:代码如下
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:progress="44"
/>
<Button
android:id="@+id/button_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始下载" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
private Button mButtonDown;
private ProgressBar mProgressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonDown = (Button) findViewById(R.id.button_down);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
mButtonDown.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DownloadFilesTask().execute();
}
});
}
private class DownloadFilesTask extends AsyncTask<String, String, String> {
private int count=0;
/**
* @param params execute()中传入的参数
* @return 传给onPostExecute的参数
* doInBackground不能与UI进行交互,但可以传递给onProgressUpdate,onPostExecute方法进行操作
*/
@Override
protected String doInBackground(String... params) {
while (count<101){
count++;
publishProgress(""+count);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "下载完成";
}
/**
* 在doInBackground结束时执行
* @param s
*/
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
mButtonDown.setText(s);
}
/**
* 在doInBackground中使用publishProgress(""+count)给onProgressUpdate传递参数,进行UI的更新
* @param values
*/
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
int count = Integer.parseInt(values[0]);
mProgressBar.setProgress(count);
}
}
}
- AsyncTask详解 并实现实例-模拟下载
- AsyncTask详解与下载图片实例
- AsyncTask模拟下载学习
- AsyncTask下载并更新ProgressBar
- 详解AsyncTask实现原理
- Servlet实现文件下载详解与实例
- AsyncTask实现下载网络图片
- AsyncTask异步实现文件下载
- AsyncTask异步实现文件下载
- 使用AsyncTask实现异步下载
- Android进度条实例-实现模拟下载进…
- android AsyncTask异步下载并更新进度条
- AsyncTask下载远程apk并安装
- 使用AsyncTask下载图片并更新进度
- 使用AsyncTask下载图片并显示进度条
- AsyncTask下载网络文件,并显示下载进度
- AsyncTask下载网络图片并显示下载进度
- 使用AsyncTask实现异步文件下载
- poj1083
- JavaScript词法分析过程
- Apache Spark 1.5新特性介绍
- OC08_字典Dictionary
- mac常用shell命令
- AsyncTask详解 并实现实例-模拟下载
- 进程间通信之共享内存-SystemV shmxxx详解(IPC范例篇)
- 学习使用Mark Man、Axure
- java job 资源
- ReThought (一): 如何构建理想的开发团队
- Valid Number
- 啊
- hdu1281(Hungary模板 + 枚举)简单
- Linux 软件安装到 /usr,/usr/local/ 还是 /opt 目录?