AsyncTask
来源:互联网 发布:mac 命令行链接mysql 编辑:程序博客网 时间:2024/06/06 05:39
构建AsyncTask子类的泛型参数
AsyncTask <Params,Progress,Result>是一个抽象类,通常用于被继承
- Params:启动任务时输入的参数类型
- Progress:后台任务执行中返回进度值的类型
- Result:后台任务执行完成后返回结果的类型
AsyncTask子类的回调方法主要有
- doInBackground:必须重写,异步执行后台线程要完成的任务,耗时操作将在此方法中完成
- onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作
- onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新
- onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法可以获取任务的完成进度
ImageActivity.java (加载网络图片)
import android.app.Activity;import android.graphics.*;import android.os.*;import android.view.View;import android.widget.*;import java.io.*;import java.net.*;/** * Created by caobotao on 15/12/2. */public class ImageActivity extends Activity { private ImageView imageView ; private ProgressBar progressBar ; private static String URL = "http://pic3.zhongsou.com/image/38063b6d7defc892894.jpg"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image); imageView = (ImageView) findViewById(R.id.image); progressBar = (ProgressBar) findViewById(R.id.progressBar); //通过调用execute方法开始处理异步任务.相当于线程中的start方法. new MyAsyncTask().execute(URL); } class MyAsyncTask extends AsyncTask<String,Void,Bitmap> { //onPreExecute用于异步处理前的操作 @Override protected void onPreExecute() { super.onPreExecute(); //此处将progressBar设置为可见. progressBar.setVisibility(View.VISIBLE); } //在doInBackground方法中进行异步任务的处理. @Override protected Bitmap doInBackground(String... params) { //获取传进来的参数 String url = params[0]; Bitmap bitmap = null; URLConnection connection ; InputStream is ; try { connection = new URL(url).openConnection(); is = connection.getInputStream(); //为了更清楚的看到加载图片的等待操作,将线程休眠3秒钟. Thread.sleep(3000); BufferedInputStream bis = new BufferedInputStream(is); //通过decodeStream方法解析输入流 bitmap = BitmapFactory.decodeStream(bis); is.close(); bis.close(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return bitmap; } //onPostExecute用于UI的更新.此方法的参数为doInBackground方法返回的值. @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); //隐藏progressBar progressBar.setVisibility(View.GONE); //更新imageView imageView.setImageBitmap(bitmap); } }}
需要在Activity的onPause()方法中将正在执行的task标记为cancel状态,在doInBackground方法中进行异步处理时判断是否是cancel状态来决定是否取消之前的task.
ProgressActivity.java
import android.app.Activity;import android.os.AsyncTask;import android.os.AsyncTask.Status;import android.os.Bundle;import android.widget.ProgressBar;import java.util.Scanner;/** * Created by caobotao on 15/12/2. */public class ProgressActivity extends Activity{ private ProgressBar progressBar; private MyAsyncTask myAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.progress); progressBar = (ProgressBar) findViewById(R.id.progress); myAsyncTask = new MyAsyncTask(); //启动异步任务的处理 myAsyncTask.execute(); } //AsyncTask是基于线程池进行实现的,当一个线程没有结束时,后面的线程是不能执行的. @Override protected void onPause() { super.onPause(); if (myAsyncTask != null && myAsyncTask.getStatus() == Status.RUNNING) { //cancel方法只是将对应的AsyncTask标记为cancelt状态,并不是真正的取消线程的执行. myAsyncTask.cancel(true); } } class MyAsyncTask extends AsyncTask<Void,Integer,Void>{ @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); //通过publishProgress方法传过来的值进行进度条的更新. progressBar.setProgress(values[0]); } @Override protected Void doInBackground(Void... params) { //使用for循环来模拟进度条的进度. for (int i = 0;i < 100; i ++){ //如果task是cancel状态,则终止for循环,以进行下个task的执行. if (isCancelled()){ break; } //调用publishProgress方法将自动触发onProgressUpdate方法来进行进度条的更新. publishProgress(i); try { //通过线程休眠模拟耗时操作 Thread.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } return null; } }}
.使用AsyncTask的注意事项
① 必须在UI线程中创建AsyncTask的实例.
② 只能在UI线程中调用AsyncTask的execute方法.
③ AsyncTask被重写的四个方法是系统自动调用的,不应手动调用.
④ 每个AsyncTask只能被执行(execute方法)一次,多次执行将会引发异常.
⑤ AsyncTask的四个方法,只有doInBackground方法是运行在其他线程中,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI的更新操作.
作者:caobotao
出处: http://www.cnblogs.com/caobotao/p/5020857.html
1 0
- AsyncTask
- ASyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- 使用webview几种常见的hybrid通信方式
- poj 1873 The Fortified Forest 搜索+凸包
- 判断一个变量是否为数组的几种方法
- 一句SQL查出所有课程成绩最高和最低的学生及其分数
- Spring In Action 03 ---面向切面的Spring
- AsyncTask
- (四)环境搭建和页面引入、实体和映射的创建
- 2道通杀的iOS/Android笔试题
- Android 内存优化
- StartActivityForResult简单使用
- centos 6.5 查看df -ah 和 du -sh 空间不一致的情况问题分析
- 关于程序版面
- Android 内存优化 2
- eclipse导入java项目出现多处错误解决方案