帝国cms 网站地图标签,制作app连接网站,电子厂家网站建设,wordpress 公众号登录一、概念 是一个抽象泛型类#xff0c;由 Android 封装的一个轻量级异步类#xff0c;它可以在线程池中执行后台任务#xff0c;然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 内部封装了两个线程池#xff08;SerialExecutor、THREAD_POOL_EXECUTOR#x…一、概念 是一个抽象泛型类由 Android 封装的一个轻量级异步类它可以在线程池中执行后台任务然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。 内部封装了两个线程池SerialExecutor、THREAD_POOL_EXECUTOR和一个HandleInternalHandler。SerialExecutor 用于任务的排队让需要执行的多个耗时任务按顺序排列。THREAD_POOL_EXECUTOR 才真正的执行任务。InternalHandler 用于从子线程切换到主线程。 二、使用 public abstract class AsyncTaskParams, Progress, Result //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 AsyncTaskString, Integer, String{//任务执行前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);}
}