一个例子,看懂AsnycTask
来源:互联网 发布:淘宝上卖adidas高仿鞋 编辑:程序博客网 时间:2024/05/22 15:49
利用AsnycTask获取csdn logo.
package com.example.asynctaskdemo;import java.io.IOException;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private ImageView imageView;private ProgressBar progressBar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {Button button = (Button) findViewById(R.id.button1);imageView = (ImageView) findViewById(R.id.iv);progressBar = (ProgressBar) findViewById(R.id.progressBar);button.setOnClickListener(this);}@Overridepublic void onClick(View v) {FinishTask task = new FinishTask();// 执行获取csdn logotask.execute("http://csdnimg.cn/public/favicon.ico");}/** * AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行, 3、进度更新,4、完成后台任务,5、取消任务 */// AsyncTask的构造函数有三个模板参数:// 1.Params,传递给后台任务的参数类型。// 2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)// 3.Result, 后台执行返回的结果的类型。// AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。public class FinishTask extends AsyncTask<String, Integer, Bitmap> {private static final String TAG = "MainActivity-->FinishTask";private Bitmap bm;// 1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用// 这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。@Overrideprotected void onPreExecute() {Log.i(TAG, "执行onPreExecute");progressBar.setProgress(0);// 进度条复位super.onPreExecute();}// 2、正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行// 结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中// 。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof// progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。@Overrideprotected Bitmap doInBackground(String... params) {Log.i(TAG, "执行doInBackground");publishProgress(0);HttpClient httpClient = new DefaultHttpClient();try {System.out.println("currentTime");Thread.sleep(3000);System.out.println("currentTime");publishProgress(30);} catch (InterruptedException e1) {e1.printStackTrace();}HttpGet httpGet = new HttpGet(params[0]);try {Thread.sleep(3000);publishProgress(60);} catch (InterruptedException e1) {e1.printStackTrace();}try {HttpResponse response = httpClient.execute(httpGet);bm = BitmapFactory.decodeStream(response.getEntity().getContent());} catch (ClientProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}try {Thread.sleep(3000);progressBar.setProgress(100);} catch (InterruptedException e1) {e1.printStackTrace();}return bm;}// 3.进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)// 方法调用完后被调用。一般用于动态地显示一个进度条。@Overrideprotected void onProgressUpdate(Integer... values) {Log.i(TAG, "执行onProgressUpdate ");progressBar.setProgress(values[0]);}// 4. 完成后台任务:onPostExecute(Result),// 当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。@Overrideprotected void onPostExecute(Bitmap result) {Log.i(TAG, "执行onPostExecute ");if (result != null) {Toast.makeText(MainActivity.this, "下载成功!", Toast.LENGTH_LONG).show();imageView.setImageBitmap(result);} else {Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_LONG).show();}}// 5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用@Overrideprotected void onCancelled(Bitmap result) {Log.i(TAG, "执行onCancelled ");progressBar.setProgress(0);// 进度条复原}}}控制台输出:
10-12 03:07:46.063: I/MainActivity-->FinishTask(1349): 执行onPreExecute10-12 03:07:46.091: I/MainActivity-->FinishTask(1349): 执行doInBackground10-12 03:07:46.095: I/MainActivity-->FinishTask(1349): 执行onProgressUpdate 10-12 03:07:46.251: I/System.out(1349): currentTime10-12 03:07:49.255: I/System.out(1349): currentTime10-12 03:07:49.255: I/MainActivity-->FinishTask(1349): 执行onProgressUpdate 10-12 03:07:52.267: I/MainActivity-->FinishTask(1349): 执行onProgressUpdate 10-12 03:07:55.667: I/MainActivity-->FinishTask(1349): 执行onPostExecute
通过以上源代码,我们了解到。实现AsyncTask, doinbackground 方法必须实现。
执行顺序 onPreExecute-->doInBackGround(onProgressUpdata)-->onPostExecute
其中:doInBackGround 不在UI线程,其他的都在UI线程。
doInBackGround 在执行 publishProgress(int i) 时,回调 onprogressUpdata 并将 i 传入.
AsyncTask参数分析:
AsyncTask<Params, Progress, Result>
| |________________
||
| publishProgress(Progress)
result doinbackground(params)---------------------------------------------------------------onProgressUpdate
|
|
onPostExecute
protected void onPreExecute() {
}
protected abstract Result doInBackground(Params... params);
protected void onProgressUpdate(Progress... values) {
}
protected void onPostExecute(Result result) {
}
protected void onCancelled(Result result) {
onCancelled();
}
- 一个例子,看懂AsnycTask
- 一个例子看懂递归
- 一个例子看懂Java反射
- 一张图一个例子让你看懂AOP
- 一个小例子看懂java对象初始化执行过程
- Java微观探源(二)_一个例子看懂JVM内存分配和回收
- C# Newtonsoft.Json解析数组的小例子看懂一个全都会
- 如何看懂一个程序
- 每天看懂一个电路图
- 如何看懂一个函数
- 如何看懂一个程序
- Android中的AsnycTask
- 如果看懂一个WSDL文档
- 怎么看懂一个MFC程序?
- 6 如何看懂一个程序
- 4j 都能看懂的例子
- 看懂这些例子,一天之内学会python2
- 一个例子
- 【Linux】【curl】对curl的研究
- 总结
- 一步一步 在mac上安装ubuntu
- vc6.0 MFC 添加控制台
- 使用Unity制作的,模拟了Scene视图查看对象的效果——查看器
- 一个例子,看懂AsnycTask
- 第七周项目3
- Java 并发编程(二)对象的发布逸出和线程封闭
- 【Linux】【VIM】打造自己的vim编辑环境
- Leetcode--Largest Rectangle in Histogram
- 并发编程 Promise, Future 和 Callback
- IOS之界面间传值
- 曼彻斯特编码
- Fedora20下FTP服务器的安装(vsftpd)