博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android_AsyncTask
阅读量:4599 次
发布时间:2019-06-09

本文共 4266 字,大约阅读时间需要 14 分钟。

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
{ 2 3 //onPreExecute用于异步处理前的操作 4 @Override 5 protected void onPreExecute() { 6 super.onPreExecute(); 7 //此处将progressBar设置为可见. 8 progressBar.setVisibility(View.VISIBLE); 9 }10 11 //在doInBackground方法中进行异步任务的处理.12 @Override13 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 @Override37 protected void onPostExecute(Bitmap bitmap) {38 super.onPostExecute(bitmap);39 //隐藏progressBar40 progressBar.setVisibility(View.GONE);41 //更新imageView42 imageView.setImageBitmap(bitmap);43 }44 }

 

使用方法二:匿名对象使用(线程池引入)

1.    public static ExecutorService LIMITED_TASK_EXECUTOR;2.    static {        LIMITED_TASK_EXECUTOR = Executors.newFixedThreadPool(15);    }3.    new AsyncTask
(){ @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
{ @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的更新操作.

 

注:本文参考文章如有疑问请联系删除

 

转载于:https://www.cnblogs.com/rainbowLover/p/10430640.html

你可能感兴趣的文章
VMware 9.0.1安装Mac OS X Mountain Lion 10.8.2
查看>>
SSL延迟
查看>>
android新手关于左右滑动的问题,布局把<android.support.v4.view.ViewPager/><ImageView/> 放在上面就不行了。...
查看>>
深入理解DIP、IoC、DI以及IoC容器
查看>>
赋值文件
查看>>
Vue 数组 字典 template v-for 的使用
查看>>
蓝牙模块选择经验谈
查看>>
java中==和equals
查看>>
CCActionPageTurn3D
查看>>
python random
查看>>
esp32-智能语音-cli(调试交互命令)
查看>>
netty与MQ使用心得
查看>>
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结
查看>>
swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端...
查看>>
Python学习笔记
查看>>
unshift()与shift()
查看>>
使用 NPOI 、aspose实现execl模板公式计算
查看>>
行为型模式:中介者模式
查看>>
How to Notify Command to evaluate in mvvmlight
查看>>
33. Search in Rotated Sorted Array
查看>>