- 浏览: 128518 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
mzba520:
这样会导致拖动列表的时候,只要有链接长按事件会被触发。
Android TextView中增加超链接的匹配后,导致非超链接区域点击失效的问题解决方案 -
cfyme:
请问一下,我成功发送了一个会议邀请,怎么取消会议邀请,怎么更改 ...
通过ical4j与javamail实现会议邀请总结 -
xyy_zero:
有没有个demo?
Android中的网络时间同步
问题现象:
app使用Asynctask从网络下载数据,并将数据同步更新到UI上进行显示。
在app使用的过程中,偶尔会出现数据未更新的情况,且这个问题现象一时找不到必现的操作方法
跟踪问题原因发现是AsyncTask.onPostExecute未被执行到的原因。
问题解决办法:
google之后,发现可以通过如下方法解决问题:
在app的application中的onCreate方法中增加如下代码
try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { e.printStackTrace(); }
问题的解决办法可以查看如下链接的一些说明:
1.http://code.google.com/p/android/issues/detail?id=20915
问题原因:
AsyncTask有如下代码:
private static final InternalHandler sHandler = new InternalHandler();
此处的InternalHandler extends Handler,且使用默认的构造函数。
看Handler的默认构造函数如下:
public Handler() { if (FIND_POTENTIAL_LEAKS) { final Class<? extends Handler> klass = getClass(); if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && (klass.getModifiers() & Modifier.STATIC) == 0) { Log.w(TAG, "The following Handler class should be static or leaks might occur: " + klass.getCanonicalName()); } } mLooper = Looper.myLooper(); if (mLooper == null) { throw new RuntimeException( "Can't create handler inside thread that has not called Looper.prepare()"); } mQueue = mLooper.mQueue; mCallback = null; }
问题原因的关键分析点在于
mLooper = Looper.myLooper();
也就是说,使用Handler使用默认的构造函数的话,Handler使用的Looper是Looper中如下函数返回的内容:
public static final Looper myLooper() { return (Looper)sThreadLocal.get(); }
以上种种,可以查看依次查看AsyncTask-->>Handler-->>Looper-->>TreadLocal的源代码自行理解。
在以上内容分析完毕后,搜索app中AsyncTask的使用场景,发现在不同的使用场景中,有一处场景在使用AsyncTask之前有如下代码
Looper myLooper = Looper.myLooper(); if (myLooper == null) { Looper.prepare(); }
找到以上代码后,也就分析出了问题重现的方式
问题结论:
1.使用AsyncTask的时候要谨慎使用Looper
发表评论
-
删除git submodule最为精准的一片描述文章
2015-02-11 00:19 1146转自 http://davidwalsh.name/git ... -
Android Manifest文件中meta-data的配置读取
2014-12-01 11:54 2704Manifest文件中配置meta-data的读取,例如如下 ... -
浏览器中打开指定的链接
2014-09-05 18:21 854浏览器中打开指定的链接 try { ... -
Android Studio打开工程出现Android SDK识别不了的问题
2014-08-19 19:51 6561问题现象: 使用Android Studio打开(imp ... -
dumpsys info
2014-04-24 15:42 737dumpsys 命令行的使用收录 1.查看ui绘制相关的 ... -
jar包编译所用的jdk版本不一致导致的问题
2014-04-01 13:10 2714所维护的app中使用到一个外部工程但是是自己维护的sdk,这 ... -
SQLiteDatabase执行计划的查看
2014-03-27 14:08 2042Android中内置的SQLite是可以通过命令行工具来查看 ... -
Android性能调优出发点
2014-03-13 17:06 558http://www.trinea.cn/android ... -
SQLiteDatabase使用问题总结
2014-03-10 17:40 2648SQLiteDatabase使用过程中经常碰到的问题 1. ... -
问题分析:java.lang.IllegalStateException: getDatabase called recursively
2014-03-05 15:33 3003问题场景: 在app首次启动使用到db的时候,后台提示如下 ... -
网络加载到的图片适配不同分辨率的手机屏幕
2013-12-18 19:38 2181对于从网络上加载到的图片信息,在解析的时候一般会解析成图片 ... -
Error inflating class问题解决思路
2013-09-25 17:13 5878修改问题的过程中,碰到如crash log中的日志信息(l ... -
Android应用性能测试(CPU和内存的性能)
2013-09-10 11:26 2573按照以下步骤进行性能测试的前置条件 1.测试手机具备ro ... -
ListView的adapter中的getView函数多次重复调用,导致数据显示重复的问题分析
2013-08-27 23:11 4895使用ListView显示数据, ... -
使用startActivityForResult启动新的Activity时,onActivityResult立马被执行的问题说明
2013-07-18 13:44 1941问题现象描述: Activity P1通过startAc ... -
使用硬件加速的注意事项
2013-07-02 11:17 2088为提高app的整体性能,在manifest文件中配置的时候, ... -
mac下调试android时设备无法识别的问题解决方案
2013-06-27 11:44 1566问题现象: 1.mac的os ... -
mac 环境变量
2013-06-26 10:33 638~/.bash_profile export ... -
GridView在复用View的时候导致部分数据显示重复的问题
2013-06-04 17:14 2184android.widget.GridView中setAda ... -
android 图片放大的处理
2013-05-29 15:37 1091场景:从网络上下载下来的小图片,直接使用设置某些区域的大小的 ...
相关推荐
在Android应用开发中,AsyncTask是一个用于在后台线程执行耗时操作并更新UI的工具类,它是Android 1.5版本引入的。AsyncTask的设计初衷是为了简化异步编程,避免直接操作线程和Handler带来的复杂性。下面我们将详细...
最后,从Android 3.0(API Level 11)开始,AsyncTask的执行策略有所改变,不再保证所有的任务都会在同一线程中执行,而是采用了串行执行的方式,以避免过多的并发导致的问题。而在Android 9.0(API Level 28)之后...
AsyncTask 是 Android 平台上一个非常重要的工具类,用于在后台线程执行耗时操作,然后在 UI 线程更新结果,从而避免了因长时间运行任务而导致的 ANR(Application Not Responding)错误。在深入探讨 AsyncTask 的...
此外,从Android 3.0(API级别11)开始,`AsyncTask`的执行策略有所改变,多个相同`AsyncTask`实例可能会并发执行,而非按顺序执行,因此在高版本Android中应特别注意这一点。 总的来说,`AsyncTask`是Android...
AsyncTask 是 Android 平台上一种轻量级的异步处理机制,主要用于在后台执行耗时操作,同时确保结果能够在主线程中安全地更新 UI。它简化了多线程编程,尤其是与用户界面交互的需求。 首先,AsyncTask 包含三个泛型...
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不... onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
AsyncTask是Android中一个用于在后台线程执行耗时操作并更新UI的工具类,它非常适合处理轻量级的异步任务。在这个"AsyncTask练习demo"中,我们可以深入理解和学习如何有效地使用AsyncTask。 首先,AsyncTask有三个...
`AsyncTask`是Android提供的一种轻量级的异步任务处理框架,它允许开发者在后台线程执行耗时操作,然后在UI线程更新结果,避免了阻塞主线程导致的ANR(Application Not Responding)问题。这篇我们将深入探讨`...
从Android 3.0(API Level 11)开始,`AsyncTask`默认是在一个单线程池中执行,这可能导致任务顺序执行而非并行。为了解决这个问题,开发者可以选择自定义线程池或者使用其他异步处理框架,如`Handler`、`Loader`、`...
在Android开发中,异步任务(AsyncTask)是一种常见的处理耗时操作的方式,尤其是在主线程中需要执行网络请求、数据库操作或大型数据处理时。它能够避免UI线程被阻塞,提供更好的用户体验。让我们深入了解一下`...
AsyncTask是Android开发中用于在UI线程之外执行耗时操作的一种工具,它允许开发者在后台线程中执行任务,并在完成后更新UI。在Android应用中,由于主线程(UI线程)负责处理用户交互,如果在此线程上执行耗时操作,...
注意,`AsyncTask`的实例是单线程的,意味着同一时间只能有一个`AsyncTask`实例在执行。如果你需要同时执行多个任务,可以考虑其他并发模型,如`IntentService`或`ExecutorService`。 总之,通过这个例子,新手可以...
Android提供了一种便捷的机制,名为`AsyncTask`,用于在后台线程执行这些任务,同时允许在主线程更新UI。`AsyncTask`是一个轻量级的框架,设计用来简化在Android应用程序中进行后台操作的过程。 `AsyncTask`包含三...
`AsyncTask`是Android提供的轻量级异步任务框架,它允许开发者在后台线程执行耗时操作,并在主线程更新UI。`AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、进度类型和返回...
其次,由于`AsyncTask`的执行队列限制,同一时间只能有三个任务处于活动状态,这可能导致并发问题。为了解决这些问题,开发者可能需要考虑使用其他的异步处理工具,如`ExecutorService`、`Handler`或`LiveData`。 `...
在Android开发中,AsyncTask是一个常用的工具类,用于在后台线程执行耗时操作,并在UI线程更新结果。本文将深入探讨`AsyncTask`的`cancel`操作,结合提供的链接文章《AsyncTask中cancel方法的误读》进行详细解析。 ...
在使用`AsyncTask`时,需要考虑兼容性问题。 4. **内存管理**:`AsyncTask`的实例不应被静态引用,因为这可能导致Activity无法正常销毁。 5. **取消任务**:通过`cancel(true)`方法可以尝试取消正在执行的任务,但...
此外,Android的AsyncTask有版本差异,从Android 3.0(API级别11)开始,AsyncTask默认改为单线程模式,避免了并发执行导致的问题,但在处理大量并发任务时,可能会降低性能。因此,在处理大量并发任务时,开发者...
为了解决这个问题,Android提供了AsyncTask,它能方便地在线程池中执行后台任务,并在完成后更新UI。 AsyncTask包含三个泛型参数,分别代表了三个步骤的数据类型: 1. `Params`:表示在后台任务执行前可以输入的...
### AndEngine分析之三——AsyncTask与BaseActivity深入解析 #### 一、AsyncTask概述 在AndEngine项目中,为了实现界面更新等操作时避免主线程阻塞的问题,使用了`AsyncTask`来处理后台任务。`AsyncTask`提供了一...