一个例子,看懂AsnycTask

利用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();
    } 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值