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>参数说明: //Params 启动任务执行的输入参数 //Progress 后台任务执行的进度 //Result 后台计算结果的类型 public class AsyncTaskSubClass extends AsyncTask<String, Integer, Bitmap> { 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<String, Integer, Bitmap> //中的第一个参数,即异步任务的输入参数. //此处Bitmap对应于AsyncTask<String, Integer, Bitmap> //中的第三个参数,即异步任务的输出结果. @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<String, Integer, Bitmap> //中的第三个参数,即异步任务的输出结果. @Override protected void onPostExecute(Bitmap bitmap) { System.out.println("调用onPostExecute()方法--->异步任务执行完毕"); if(mAsyncTaskCallbackInterface!=null){ mAsyncTaskCallbackInterface.asyncTaskFinishCallback(bitmap); } } //异步执行时在主线程中更新异步任务的执行信息 //此处values[0]对应于AsyncTask<String, Integer, Bitmap> //中的第二个参数,即异步任务的执行进度. @Override protected void onProgressUpdate(Integer... values) { return; } //异步任务被取消时,在主线程中执行相关的操作 @Override protected void onCancelled() { super.onCancelled(); System.out.println("调用onCancelled()方法--->异步任务被取消"); } }
main.xml如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> </RelativeLayout>