Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中AsyncTask異步任務使用詳細實例(二)

Android中AsyncTask異步任務使用詳細實例(二)

編輯:關於Android編程

MainActivity如下:

package cn.cc;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import cn.cc.AsyncTaskSubClass.AsyncTaskCallbackInterface;
import cn.cc.AsyncTaskSubClass.AsyncTaskPerformInterface;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
/**
 * Demo描述:
 * 平常我們寫一個AsyncTask的時候把異步操作已經異步完成後的操作
 * 是放在doInBackground()和onPostExecute()方法中的.
 * 這樣顯得代碼比較臃腫,而且不方便復用.
 * 所以在此采用AsyncTask與回調結合的方式:抽象AsyncTask的代碼從而
 * 簡化代碼,並且利於重用.
 */
public class MainActivity extends Activity {
	private Context mContext;
	private ImageView mImageView;
	private AsyncTaskSubClass mAsyncTaskSubClass;
	private String mFavIconPathString =null;
	private final String FAVICON_SERVICE="http://www.google.com/s2/favicons?domain=";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        init();
    }
    
    private void init(){
    	mContext=this;
    	mImageView=(ImageView) findViewById(R.id.imageView);
    	mFavIconPathString = FAVICON_SERVICE+"http://www.ifeng.com/";
        startAsyncTask();
    }
    
	private void startAsyncTask() {
		mAsyncTaskSubClass = new AsyncTaskSubClass(mContext,
				new AsyncTaskPerformInterface() {
					@Override
					public Bitmap performAsyncTask(String string) {
						try {
							Bitmap bitmap=null;
							InputStream inputStream = null;
							URL imageUrl = new URL(string);
							HttpURLConnection httpURLConnection = (HttpURLConnection) imageUrl.openConnection();
							httpURLConnection.setConnectTimeout(5000);
							httpURLConnection.setRequestMethod("GET");
							if (httpURLConnection.getResponseCode() == 200) {
								inputStream = httpURLConnection.getInputStream();
								bitmap = BitmapFactory.decodeStream(inputStream);
								return bitmap;
							}

						} catch (Exception e) {
							
						}
						return null;
					}
				}, 
				new AsyncTaskCallbackInterface() {
					@Override
					public void asyncTaskFinishCallback(Bitmap bitmap) {
						mImageView.setImageBitmap(bitmap);
					}
				});
		//開始執行一個異步任務
		mAsyncTaskSubClass.execute(mFavIconPathString);
	}
}


AsyncTaskSubClass如下:

package cn.cc;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.AsyncTask;
//構造函數AsyncTask參數說明: 
//Params   啟動任務執行的輸入參數
//Progress 後台任務執行的進度
//Result   後台計算結果的類型
public class AsyncTaskSubClass extends AsyncTask {
	private Context mContext;
	private AsyncTaskPerformInterface mAsyncTaskPerformInterface;
	private AsyncTaskCallbackInterface mAsyncTaskCallbackInterface;
	
	public AsyncTaskSubClass(
			     Context context,
			     AsyncTaskPerformInterface asyncTaskPerformInterface,
			     AsyncTaskCallbackInterface asyncTaskCallbackInterface) {
		super();
		this.mContext = context;
		this.mAsyncTaskPerformInterface = asyncTaskPerformInterface;
		this.mAsyncTaskCallbackInterface = asyncTaskCallbackInterface;
	}

	//執行異步操作的回調接口
	public interface AsyncTaskPerformInterface {
		public Bitmap performAsyncTask(String string);
	}
	
	//異步操作完成的回調接口
	public interface AsyncTaskCallbackInterface {
		public void asyncTaskFinishCallback(Bitmap bitmap);
	}
	
	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		System.out.println("調用onPreExecute()方法--->准備開始執行異步任務");  
	}
	
	//此處strings[0]對應於AsyncTask
	//中的第一個參數,即異步任務的輸入參數.
	//此處Bitmap對應於AsyncTask
	//中的第三個參數,即異步任務的輸出結果.
	@Override
	protected Bitmap doInBackground(String... strings) {
		System.out.println("調用doInBackground()方法--->開始執行異步任務");
		Bitmap bitmap=null;
		if(mAsyncTaskPerformInterface!=null){
			bitmap=mAsyncTaskPerformInterface.performAsyncTask(strings[0]);
		}
		return bitmap;
	}
	
	//此處Bitmap對應於AsyncTask
	//中的第三個參數,即異步任務的輸出結果.
	@Override
	protected void onPostExecute(Bitmap bitmap) {
		System.out.println("調用onPostExecute()方法--->異步任務執行完畢");
		if(mAsyncTaskCallbackInterface!=null){
			mAsyncTaskCallbackInterface.asyncTaskFinishCallback(bitmap);
		}
	}

	//異步執行時在主線程中更新異步任務的執行信息
	//此處values[0]對應於AsyncTask
	//中的第二個參數,即異步任務的執行進度.
	@Override
	protected void onProgressUpdate(Integer... values) {
		return;
	}
	
	//異步任務被取消時,在主線程中執行相關的操作 
	@Override
	protected void onCancelled() {
		super.onCancelled();
		System.out.println("調用onCancelled()方法--->異步任務被取消");
	}

}

main.xml如下:




    




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved