【发布时间】:2012-02-06 12:23:14
【问题描述】:
我有一个简单的应用程序,它可以读取互联网资源并以图像视图和文本视图的形式在小部件或列表视图活动中显示信息。 除了从 Internet 下载数据外,它还显示在 ViewFlipper 的小部件中。
当我将小部件添加到主屏幕时,它会立即触发 onUpdate,从互联网下载数据并更新小部件。这工作得很好。日志显示 onUpdate 和 dataDownloaded 相隔约 3 秒。
在下一次更新时(手机已进入睡眠模式),更新不会发生,这是我的日志报告的内容。
- onUpdate 被调用。
-
dataDownloading被调用,但在最初调用onUpdate20 秒后。我认为这是因为手机处于睡眠状态,初始化网络套接字等需要时间。 - 在此之后,我收到 ANR 日志条目,并且没有发生小部件更新,进程实际上已停止,小部件停留在屏幕上并且不响应活动内的手动更新,否则在未引发 ANR 异常时有效.
我正在寻找可能的解决方案。我正在考虑在不同的线程中调用所有下载(从 AppWidgetProvider 中,可能使用AsyncTask),将数据存储在 SQLite 或本地存储中并进行小部件更新(没有下载,只是从 SQLite 和本地存储读取数据) 在下一次onUpdate 通话中。这将使应用程序/小部件进程更具响应性,并且不会导致 ANR 出错。
这种线程方法是一种不好的做法吗?有替代方案吗?我应该改用服务吗?我倾向于不使用服务,除非它有很多优点。
对不起,文字墙:)
编辑:来自文档http://developer.android.com/guide/practices/design/responsiveness.html
当检测到以下情况之一时,Android 将显示特定应用程序的 ANR 对话框:
- 在 5 秒内没有响应输入事件(例如按键、屏幕触摸)
- BroadcastReceiver 未在 10 秒内完成执行
【问题讨论】: