Android学习之多线程开发总结<二>

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);  
        }  
};  

 

posted @ 2014-01-03 17:19  Shuaiwen8023  阅读(312)  评论(0编辑  收藏  举报