一个例子,看懂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();
    } 

0 0