利用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;
@Override
protected 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);
}
@Override
public void onClick(View v) {
FinishTask task = new FinishTask();
// 执行获取csdn logo
task.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)上显示进度条。
@Override
protected void onPreExecute() {
Log.i(TAG, "执行onPreExecute");
progressBar.setProgress(0);// 进度条复位
super.onPreExecute();
}
// 2、正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行
// 结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中
// 。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof
// progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。
@Override
protected 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...)
// 方法调用完后被调用。一般用于动态地显示一个进度条。
@Override
protected void onProgressUpdate(Integer... values) {
Log.i(TAG, "执行onProgressUpdate ");
progressBar.setProgress(values[0]);
}
// 4. 完成后台任务:onPostExecute(Result),
// 当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。
@Override
protected 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()方法时调用
@Override
protected void onCancelled(Bitmap result) {
Log.i(TAG, "执行onCancelled ");
progressBar.setProgress(0);// 进度条复原
}
}
}
控制台输出:
10-12 03:07:46.063: I/MainActivity-->FinishTask(1349): 执行onPreExecute
10-12 03:07:46.091: I/MainActivity-->FinishTask(1349): 执行doInBackground
10-12 03:07:46.095: I/MainActivity-->FinishTask(1349): 执行onProgressUpdate
10-12 03:07:46.251: I/System.out(1349): currentTime
10-12 03:07:49.255: I/System.out(1349): currentTime
10-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();
}