Android AsyncTask的缺陷和问题总结
Android AsyncTask的缺陷和问题总结
在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性。
1、生命周期
很多开发者会认为一个在Activity中创建的AsyncTask会随着Activity的销毁而销毁。然而事实并非如此。AsyncTask会一直执行, 直到doInBackground()方法执行完毕。然后,如果 cancel(boolean)被调用, 那么onCancelled(Result result) 方法会被执行;否则,执行onPostExecute(Result result) 方法。如果我们的Activity销毁之前,没有取消 AsyncTask,这有可能让我们的AsyncTask崩溃(crash)。因为它想要处理的view已经不存在了。所以,我们总是必须确保在销毁活动之前取消任务。总之,我们使用AsyncTask需要确保AsyncTask正确地取消。
另外,即使我们正确地调用了cancle() 也未必能真正地取消任务。因为如果在doInBackgroud里有一个不可中断的操作,比如BitmapFactory.decodeStream(),那么这个操作会继续下去。
2、内存泄漏
如果AsyncTask被声明为Activity的非静态的内部类,那么AsyncTask会保留一个对创建了AsyncTask的Activity的引用。如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄露。
3、结果丢失
屏幕旋转或Activity在后台被系统杀掉等情况会导致Activity的重新创建,之前运行的AsyncTask会持有一个之前Activity的引用,这个引用已经无效,这时调用onPostExecute()再去更新界面将不再生效。
4、并行还是串行
在Android 1.6之前的版本,AsyncTask是串行的,在1.6至2.3的版本,改成了并行的。在2.3之后的版本又做了修改,可以支持并行和串行,当想要串行执行时,直接执行execute()方法,如果需要并行执行,则要执行executeOnExecutor(Executor)。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
相关推荐
-
Android AsyncTask的优缺点详解
1.Asynctask简介 1.1 使用方法简介 Asynctask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html 这里只实现一个小Demo程序,供大家赏玩: 界面: 这个程序其实特别简单,就是两个按钮,点击分别用来测试AysncTask和Handler两种模式的实现,点击后会有相应的Log提示
-
Android 中使用 AsyncTask 异步读取网络图片
1.新建Android工程AsyncLoadPicture 新建布局文件activity_main.xml主界面为一个GridView,还有其子项布局文件gridview_item.xml 2.功能主界面MainActivity.java,主代码如下 package com.example.asyncloadpicture; import java.util.ArrayList; import android.app.Activity; import android.content.Conte
-
详解Spring/Spring boot异步任务编程WebAsyncTask
今天一起学习下如何在Spring中进行异步编程.我们都知道,web服务器处理请求 request 的线程是从线程池中获取的,这也不难解释,因为当web请求并发数非常大时,如何一个请求进来就创建一条处理线程,由于创建线程和线程上下文切换的开销是比较大的,web服务器最终将面临崩溃.另外,web服务器创建的处理线程从头到尾默认是同步执行的,也就是说,假如处理线程A负责处理请求B,那么当B没有 return 之前,处理线程A是不可以脱身去处理别的请求的,这将极大限制了web服务器的并发处理能力. 因此
-
Android使用AsyncTask下载图片并显示进度条功能
在Android中实现异步任务机制有两种方式,Handler和AsyncTask.这篇文章给大家介绍Android使用AsyncTask下载图片并显示进度条功能. AsyncTask下载图片并显示下载进度,异步类AsyncTask配合进度条,简练! public class AsyncTaskActivity2 extends Activity { private Button btnDown;//图片框 private ImageView ivImage;//图片URL private sta
-
Android中使用AsyncTask实现下载文件动态更新进度条功能
1. 泛型 AysncTask<Params, Progress, Result> Params:启动任务时传入的参数,通过调用asyncTask.execute(param)方法传入. Progress:后台任务执行的进度,若不用显示进度条,则不需要指定. Result:后台任务结束时返回的结果. 2. 重要方法 doInBackground(Params... params):必须重写的方法,后台任务就在这里执行,会开启一个新的线程.params为启动任务时传入的参数,参数个数不定. on
-
浅谈Android AsyncTask内存安全的一种使用方式
问题 内部类和内部匿名类会导致内存泄漏,所以很多时候异步代码写的很多.之后一直在想,异步代码到底应该怎么写.怎么才是规范的写法.怎么才是简洁的写法. 思路 以一个弱引用的接口作为主线程与子线程交流的桥梁. 代码 WeakTask.java public class WeakTask<T> extends AsyncTask<Void, Void, T> { private WeakReference<OnWeakTaskListener<T>> listen
-
Spring Boot 使用WebAsyncTask异步返回结果
在Spring Boot中(Spring MVC)下请求默认都是同步的,一个请求过去到结束都是由一个线程负责的,很多时候为了能够提高吞吐量,需要将一些操作异步化,除了一些耗时的业务逻辑可以异步化,我们的查询接口也是可以做到异步执行. 一个请求到服务上,是用的web容器的线程接收的,比如线程http-nio-8084-exec-1 我们可以使用WebAsyncTask将这个请求分发给一个新的线程去执行,http-nio-8084-exec-1可以去接收其他请求的处理.一旦WebAsyncTask返
-
Android带进度条的下载图片示例(AsyncTask异步任务)
为什么要用异步任务? 在Android中只有在主线程才能对ui进行更新操作,而其它线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把所有的操作都放在主线程中操作 ,比如一些耗时操作.如果放在主线程中 会造成阻塞 而当阻塞事件过长时 系统会抛出anr异常.所以我们要使用异步任务.android为我们提供了一个封装好的组件asynctask. AsyncTask可以在子线程中更新ui,封装简化了异步操作.适用于简单的异步处理.如果多个后台任务时就要使用Handler了
-
Android使用AsyncTask加载图片的操作流程
加载图片基本操作 一.创建AsyncTask子类 将ImageView的弱引用设置为成员变量,创建构造函数传入ImageView对象. 调用指定大小解析Bitmap方法. 因为是弱引用,所以必须判断引用是否被回收.如果异步任务完成前,用户离开Activity或者设置发生改变,ImageView也可能不存在. class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { private final WeakReference&
-
Android AsyncTask的缺陷和问题总结
Android AsyncTask的缺陷和问题总结 在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况.AsyncTask适用于后台操作只有几秒的短时操作.但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性. 1.生命周期 很多开发者会认为一个在Activity中创建的AsyncTask会随着Activity的销毁而销毁.然而事实并非如此.Async
-
Android AsyncTask的缺陷和问题总结
Android AsyncTask的缺陷和问题总结 在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况.AsyncTask适用于后台操作只有几秒的短时操作.但是AsyncTask本身存在很多糟糕的问题,如果使用中不注意,将会影响程序的健壮性. 1.生命周期 很多开发者会认为一个在Activity中创建的AsyncTask会随着Activity的销毁而销毁.然而事实并非如此.Async
-
Android AsyncTask详解及使用方法
Android AsyncTask详解及使用方法 简介: AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务. AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 一.如果想自定义一个AsyncTask,可以写一个类,继承AsyncTask. eg: . //第一个参数为doInBackground中传入的类型,第二个为
-
Android AsyncTask用法巧用实例代码
Android AsyncTask 联系人导入 new AsyncTask<ArrayList<ContactInfo>, Integer, ArrayList<ContactInfo>>() { @Override protected void onPreExecute() { super.onPreExecute(); if (importingDialog != null) importingDialog.show(); } @Override protected
-
Android AsyncTask实现机制详细介绍及实例代码
Android AsyncTask实现机制 示例代码: public final AsyncTask<Params, Progress, Result> execute(Params... params) { return executeOnExecutor(sDefaultExecutor, params); } public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Pa
-
Android AsyncTask实现异步处理任务的方法详解
Android AsyncTask实现异步处理任务的方法详解 在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. Android 单线程模型概念详解:http://www.jb51.net/article/112165.htm 在单线程模型中始终要记住两条法则: 不要阻塞UI线程 确保只在UI线程中访问Android UI工具包 当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),
-
Android AsyncTask源码分析
Android中只能在主线程中进行UI操作,如果是其它子线程,需要借助异步消息处理机制Handler.除此之外,还有个非常方便的AsyncTask类,这个类内部封装了Handler和线程池.本文先简要介绍AsyncTask的用法,然后分析具体实现. 基本用法 AsyncTask是一个抽象类,我们需要创建子类去继承它,并且重写一些方法.AsyncTask接受三个泛型参数: Params: 指定传给任务执行时的参数的类型 Progress: 指定后台任务执行时将任务进度返回给UI线程的参数类型 Re
-
Android AsyncTask使用以及源码解析
综述 在Android中,我们需要进行一些耗时的操作,会将这个操作放在子线程中进行.在子线程操作完成以后我们可以通过Handler进行发送消息,通知UI进行一些更新操作(具体使用及其原理可以查看Android的消息机制--Handler的工作过程这篇文章).当然为了简化我们的操作,在Android1.5以后为我们提供了AsyncTask类,它能够将子线程处理完成后的结果返回到UI线程中,之后我们便可以根据这些结果进行一列的UI操作了. AsyncTask的使用方法 实际上AsyncTask内部也
-
Android AsyncTask完全解析 带你从源码的角度彻底理解
我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制.之前我也写过了一篇文章从源码层面分析了Android的异步消息处理机制. 不过为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程,我们本篇文章的主角也就正是它了. AsyncTask很早就出现在Android的API里了,所以我相信大多数朋友对它的用法都已经非常熟悉.不过今天我
随机推荐
- AngularJS实现一次监听多个值发生的变化
- Angular directive递归实现目录树结构代码实例
- spring task 定时任务实现示例
- mybatis二级缓存的实现代码
- python实现简单的socket server实例
- VMware10.0.7安装centos6.3,连接xshell
- 谷歌浏览器调试JavaScript小技巧
- js实现禁止中文输入的方法
- PHP把JPEG图片转换成Progressive JPEG的方法
- php实现paypal 授权登录
- php 阴历-农历-转换类代码
- 基于Python3 逗号代码 和 字符图网格(详谈)
- php获取远程图片体积大小的实例
- js实现按钮控制带有停顿效果的图片滚动
- 有关数据库SQL递归查询在不同数据库中的实现方法
- MySQL 编码机制
- 灰鸽子引起的多个IEXPL0RE.EXE的清除方法
- VC读配置文件实例
- C#实现给定字符串生成MD5哈希的方法
- Android高仿2048小游戏实现代码