我一直在为Android项目构建一个漂亮的图形选择器。不幸的是,由于应用程序的UI线程中存在死锁,这个选择器让我感到非常沮丧。解析和渲染构成每个时钟的各种SVG层是相对昂贵的操作。在进行这些操作时锁定用户界面显然是糟糕的设计,所以我努力提供良好的反馈。
选择器由两列组成,左边是时钟图像,右边是时钟名称。使用标准的ListActivity支持,目标是在左列中显示不确定的进度图像,直到加载和渲染时钟图层。此时,隐藏动画进度图像并显示时钟图像。
实施在概念上很简单。列表适配器是标准BaseAdapter实现的子类,以提供getView方法的实现。 getView方法将时钟图像的加载委托给异步执行程序服务,使用户界面保持活动状态。当异步任务完成时,它会将一个runnable发布到UI线程以隐藏进度指示器并显示图像视图。还有与正确处理回收物品视图相关的逻辑。
虽然这主要是有效的,但是我遇到了一个锁定UI线程的随机死锁条件,通常会导致向用户发出“应用程序无响应”(ANR)错误消息。我所有的诊断和解决这个问题的尝试都以失败告终。到目前为止,我已经尝试了所有“标准”方法来诊断这个:
此时,我已经完成了关于如何自行追踪并解决此问题的好主意。我删除了我的代码中的所有同步,我仍然挂断,暗示在底层平台代码中有某种挂起。没有堆栈跟踪,我在这一点上真的是盲目的。任何人都可以提出任何想法吗?