android学习之AsyncTask
AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程.
构建AsyncTask子类的泛型参数
AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承.继承AsyncTask需要指定如下三个泛型参数:
Params:启动任务时输入的参数类型.
Progress:后台任务执行中返回进度值的类型.
Result:后台任务执行完成后返回结果的类型.
构建AsyncTask子类的回调方法
AsyncTask主要有如下几个方法:
doInBackground:必须重写,异步完成耗时操作
onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作、初始化进度条.
onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.
onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.
使用方式eg一:实例化对象
1 class MyAsyncTask extends AsyncTask<String,Void,Bitmap> { 2 3 //onPreExecute用于异步处理前的操作 4 @Override 5 protected void onPreExecute() { 6 super.onPreExecute(); 7 //此处将progressBar设置为可见. 8 progressBar.setVisibility(View.VISIBLE); 9 } 10 11 //在doInBackground方法中进行异步任务的处理. 12 @Override 13 protected Bitmap doInBackground(String... params) { 14 //获取传进来的参数 15 String url = params[0]; 16 Bitmap bitmap = null; 17 URLConnection connection ; 18 InputStream is ; 19 try { 20 connection = new URL(url).openConnection(); 21 is = connection.getInputStream(); 22 BufferedInputStream bis = new BufferedInputStream(is); 23 //通过decodeStream方法解析输入流 24 bitmap = BitmapFactory.decodeStream(bis); 25 is.close(); 26 bis.close(); 27 } catch (IOException e) { 28 e.printStackTrace(); 29 } catch (InterruptedException e) { 30 e.printStackTrace(); 31 } 32 return bitmap; 33 } 34 35 //onPostExecute用于UI的更新.此方法的参数为doInBackground方法返回的值. 36 @Override 37 protected void onPostExecute(Bitmap bitmap) { 38 super.onPostExecute(bitmap); 39 //隐藏progressBar 40 progressBar.setVisibility(View.GONE); 41 //更新imageView 42 imageView.setImageBitmap(bitmap); 43 } 44 }
使用方法二:匿名对象使用(线程池引入)
1. public static ExecutorService LIMITED_TASK_EXECUTOR; 2. static { LIMITED_TASK_EXECUTOR = Executors.newFixedThreadPool(15); } 3. new AsyncTask<Void,Void,Boolean>(){ @Override protected Boolean doInBackground(Void... voids) { Boolean result=TALKSDK.getInstance().startRealPlay(0,CommUtils.getString("deviceserIal",null,getApplicationContext()),deviceNo,call_surfaceView,mHandler); return result; } protected void onPostExecute(Boolean result) { if(result){ Toaster.showShort( VideoModuleActivity.this, "预览成功"); }else{ Toaster.showShort( VideoModuleActivity.this, "预览失败"); } }; }.executeOnExecutor(LIMITED_TASK_EXECUTOR);
使用方法三:进度条更新
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的更新操作.
注:本文参考文章http://www.cnblogs.com/caobotao/p/5020857.html如有疑问请联系删除