package com.example.test; import java.io.ByteArrayOutputStream; import java.io.InputStream; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import android.content.Context; import android.os.AsyncTask; import android.util.Log; public class TestAsyncTask extends AsyncTask<String, Integer, String> { private static final String TAG = TestAsyncTask.class.getSimpleName(); private Context ctx; AsyncTaskCallback cb = null; public static final int PRE_EVENT = 1; public static final int POST_EVENT = 2; public static final int CACEL_EVENT = 3; public static interface AsyncTaskCallback { // 显示结果 void onAsyncResult(int e, String s); // 显示进度条 void onAsyncProcess(Integer pi); } public TestAsyncTask(Context ctx, AsyncTaskCallback cb) { super(); this.ctx = ctx; this.cb = cb; } @Override protected void onPreExecute() { Log.i(TAG, "onPreExecute called"); cb.onAsyncResult(PRE_EVENT, "loading..."); } // doInBackground方法内部执行后台任务 @Override protected String doInBackground(String... params) { Log.i(TAG, "doInBackground called: params : " + params[0]); try { HttpClient client = new DefaultHttpClient(); HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); long total = entity.getContentLength(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[512]; int count = 0; int length = -1; while ((length = is.read(buf)) != -1) { baos.write(buf, 0, length); count += length; // 调用publishProgress公布进度,最后onProgressUpdate方法将被执行 publishProgress((int) ((count / (float) total) * 100)); // 为了演示进度条,休眠100毫秒 Thread.sleep(100); } return new String(baos.toByteArray(), "utf-8"); } } catch (Exception e) { Log.e(TAG, e.getMessage()); } return null; } @Override protected void onPostExecute(String result) { Log.i(TAG, "onPostExecute called: result : " + result); cb.onAsyncResult(POST_EVENT, result); } @Override protected void onCancelled() { Log.i(TAG, "onCancelled called"); cb.onAsyncResult(CACEL_EVENT, "cancle..."); } @Override protected void onProgressUpdate(Integer... values) { Log.i(TAG, "onProgressUpdate called progress:" + values[0]); cb.onAsyncProcess(values[0]); } }
AsyncTaskCallback cb = new AsyncTaskCallback() { @Override public void onAsyncResult(int e, String s) { Log.i(TAG, "onAsyncResult event:" + e + " result:" + s); Message msg = Message.obtain(); msg.what = 1; msg.arg1 = e; msg.obj = (Object) s; testH.sendMessage(msg); } @Override public void onAsyncProcess(Integer pi) { Message msg = Message.obtain(); msg.what = 2; msg.obj = (Object) pi; testH.sendMessage(msg); } };