关闭

Android中如何处理耗时操作,AsyncTask有什么不足之处.

标签: android线程asynctask
1576人阅读 评论(1) 收藏 举报
分类:

Android中处理耗时操作的基本思路为将耗时的操作放到非UI线程执行.常用的是AsyncTask,Handler,Thread,Executors等.

关于放在非UI线程处理的思路大概有这样几种,一种是每次耗时操作启动一个线程,代价比较大,另一种是将所有的一部分放入队列,有一个或者几个线程去执行,例如HandlerThread和AsyncTask.

AsyncTask使用起来比较轻量,但是自身也存在一些问题.主要表现在:

  1. cancel方法实现不是很好.如果你调用了AsyncTask的cancel(false)方法,doInBackground()仍然会执行到方法结束,只是不会去调用onPostExecute()方法,但是实际上也是让程序执行了没有意义的操作.如果调用cancel(true),mayInterruptIfRunning设置为true,会使任务尽早结束,但是如果doInBackground()有不可被打断的方法,就会失效,比如BitmapFactory.decodeStream()操作.
  2. 内存泄露,在Activity中使用非静态匿名内部类AsyncTask类,由于Java内部类的特点,内部类持有外部类引用,而由于AsyncTask生命周期可能比Activity的长,当Activity销毁时,AsyncTask还在执行,由于AsyncTask持有Activity的引用,导致Activity对象无法回收,进而产生内存泄露.
  3. 结果丢失,当屏幕旋转等造成Activity重新创建时AsyncTask数据丢失的问题.当Actviity销毁并创建新的收,还在运行的AsyncTask会持有一个Activity的非法引用,即之前Activity的实例,导致onPostExecute()方法无效.
  4. 串行,并行多版本不一致.1.6之前为串行,1.6-2.3为并行,3.0之后又改为串行,但是可以通过executeOnExecutor()实现并行处理.
0
0
查看评论

为什么Android的AsyncTask不适合执行长时间操作的任务

Android API中有提到,AsyncTask非常适合短时间异步操作。如果要执行长时间操作,最好使用线程池Executor: AsyncTasks should ideally be used for short operations (a few seconds at the most....
  • HGuang_ZJH
  • HGuang_ZJH
  • 2014-11-26 17:00
  • 6237

AsyncTask的缺陷和问题

在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性...
  • goodlixueyong
  • goodlixueyong
  • 2015-05-21 20:09
  • 17667

使用Thread来实现耗时操作和刷新UI

实现原理: 创建一个Thread对象,然后在其run方法中调用runOnUiThread方法,在run中执行耗时操作,在runOnUiThread方法执行耗时操作完成后需要更新的UI,不要忘记调用Thread的start方法。我此处是在模拟耗时操作的时候让其显示了一个进度条,在耗时操作结束时让进度...
  • eclipse_yin
  • eclipse_yin
  • 2016-11-17 07:26
  • 1417

AsyncTask异步执行耗时操作

AsyncTask的具体用法详情可以看代码注释 一、Activity代码 package git.greetty.com.async; import android.os.AsyncTask; import android.os.SystemClock; import android.su...
  • cgt_cgt
  • cgt_cgt
  • 2016-12-20 16:21
  • 465

Android AsynTask源码分析和优缺点

AsynTask是Android SDK中自带的网络请求API,今天来分析下AsynTask的源代码,顺便说一下AsynTask的用法和优缺点。 先来看看AsynTask是怎么用的:
  • hgd613
  • hgd613
  • 2016-03-31 16:07
  • 606

Android中处理耗时操作的方法有哪些?

HandlerThread Thread Service IntentService
  • xhl86xhl
  • xhl86xhl
  • 2014-02-25 13:56
  • 2458

Android耗时任务处理方案--AsyncTask

在android应用中,每一个应用都对应一个进程,而应用的进程默认情况下只会开启一个线程即主线程。所有的操作都发生在主线程(或者称为UI线程)。 主线程的生死存亡是和进程一致的。 运行在UI线程中的操作主要有System Event, Input Event, Application, Serv...
  • madahe
  • madahe
  • 2016-11-05 09:04
  • 643

(三)AsyncTask

前言:前面看到Handler、HandlerThread、IntentService都与异步任务有关,这让我联系到了AsyncTask,这也是很有名的可以执行异步任务的类,Android已经帮我们封装好了准备、执行、状态更新以及提交结果的接口。1. AsyncTask使用很多例子都是用进度条来演示的...
  • sinat_20059415
  • sinat_20059415
  • 2018-02-10 14:47
  • 9

android耗时任务_ANR

ANR 有些应用在使用中会弹出一个对话框,一般这个对话框叫做应用程序无响应对话框(ANR:Application Not Responding)。虽然这个提示框有等待和关闭应用程序两种选择,但是它的弹出就已经影响了用户使用app过程中的体验,所以一般来说,Android开发的过程中都会严格控制ANR...
  • w2865673691
  • w2865673691
  • 2015-05-26 14:41
  • 2279

如何在 BroadcastReceiver 中执行耗时操作?

一、BroadcastReceiver 注册方式     BroadcastReceiver 有两种注册方式,一是使用 { Context.registerReceiver()} 动态注册,另一种是在 AndroidManifest.xm...
  • coralline_xss
  • coralline_xss
  • 2017-04-14 13:08
  • 1681
    个人资料
    • 访问:375523次
    • 积分:5597
    • 等级:
    • 排名:第5628名
    • 原创:206篇
    • 转载:8篇
    • 译文:0篇
    • 评论:145条
    博客专栏
    文章分类
    最新评论