Android - AsyncTask

一、概念

        是一个抽象泛型类,由 Android 封装的一个轻量级异步类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。

        内部封装了两个线程池(SerialExecutor、THREAD_POOL_EXECUTOR)和一个Handle(InternalHandler)。SerialExecutor 用于任务的排队,让需要执行的多个耗时任务按顺序排列。THREAD_POOL_EXECUTOR 才真正的执行任务。InternalHandler 用于从子线程切换到主线程。

二、使用

public abstract class AsyncTask

//Parmas:对应 doInBackground() 中的参数类型,即任务开始时,传入的参数类型。

//Progress:对应 onProgressUpdate() 中的参数类型,即任务执行中,返回下载进度值的类型。

//Result:对应 onPostExecute() 中的参数类型,即任务执行完,返回的结果类型。

//如果三个方法确定不需要传递具体参数,那么这三个泛型参数可以用 Void 代替。

onPreExecute( ) 任务执行前调用,在主线程执行(用于界面初始化操作如弹出进度条对话框等)。
doInBackground( ) 执行耗时任务,在子线程执行。调用 publishProgress( ) 设置进度,调用 return 返回结果。
onProgressUpdate( ) 用于更新进度,在主线程执行。
onPostExecute( ) 用于获取结果,在主线程执行。
onCancelled( ) 任务取消时调用,在主线程执行。并不是真正取消任务只是设置为取消状态,类似于终止一个线程调用 interrupt() 只是标记中断。
mTask = new MyTask();	//注意每次需new一个实例,一个AsyncTask任务只能被执行一次,否则会出现异常
mTask.execute("http://www.baidu.com","www.qq.com","www.taobao.com");
mTask.cancel(true);	//取消一个正在执行的任务,onCancelled方法将会被调用
private class MyTask extends AsyncTask{

	//任务执行前
	protected void onPreExecute() {
            textView.setText("loading...");
        }

	//执行任务
	protected String doInBackground(String... params) {
            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[1024];
                    int count = 0;
                    int length = -1;
                    while ((length = is.read(buf)) != -1) {
                        baos.write(buf, 0, length);
                        count += length; 
                        //设置进度
                        publishProgress((int) ((count / (float) total) * 100));
                        Thread.sleep(500);	//为了演示进度,休眠500毫秒
                    }
                    return new String(baos.toByteArray(), "gb2312");
                }
            } catch (Exception e) {
                Log.e(TAG, e.getMessage());
            }
            return null;
        }

	    //更新进度
        protected void onProgressUpdate(Integer... progresses) {
            progressBar.setProgress(progresses[0]);
            textView.setText("loading..." + progresses[0] + "%");
        }

        //获取结果
        protected void onPostExecute(String result) {
            textView.setText(result);
            execute.setEnabled(true);
            cancel.setEnabled(false);
        }

        //任务取消时
        protected void onCancelled() {
            textView.setText("cancelled");
            progressBar.setProgress(0);
            execute.setEnabled(true);
            cancel.setEnabled(false);
        }
} 

你可能感兴趣的:(Android,android)