【问题标题】:Loading an Android UI avoiding locking加载 Android UI 避免锁定
【发布时间】:2012-01-04 15:33:00
【问题描述】:
我正在为 Android 构建一个新闻阅读器,其中第一个 Activity 将显示最新新闻列表以及缩略图预览图像。
为了获得缩略图,我必须运行一个方法,这会大大增加加载时间;所以,我想创建一个单独的线程来每次运行。
更具体地说,我想先加载新闻标题,然后一张一张加载图片;在执行所有这些操作时,我不希望 UI 被锁定(例如,如果用户触摸新闻,我希望应用程序加载它,即使还有一些缩略图仍在加载)。
我的问题是:我应该使用处理程序(每个新闻一个线程)还是 AsyncTask(每个新闻一个 asyncTask 对象)来实现这一点?
感谢您的回复。
【问题讨论】:
标签:
android
handler
android-asynctask
【解决方案1】:
Handler Vs AsyncTask
我会使用 asynctask 下载所有“新闻链接”,然后让该 asynctask 调用 asynctask 来下载每个缩略图并在 PostExecute 上更新 UI。然后,如果用户在完成之前点击了一个链接,您可以在主 Asynctask 上调用 cancel,这将检查每个缩略图 asynctask 之间的 isCancelled() 并在它被取消时返回。
【解决方案2】:
毫无疑问,AsyncTasks 比线程处理程序架构更加简化和模块化,但在内部它们以相同的方式执行操作。
遇到您的问题,我建议先加载新闻。
您的新闻 pojo/class 可以像包含两个字段,
title 和 imageUrl。
现在显示新闻列表并启动另一个 AsyncTask,它会一张一张地获取图像并将它们存储在 Data Str/list 中。
每次从服务器获取图像时,您的适配器都应该是“notifyDataSetChanged()”。
这样您就可以让用户首先看到新闻,并且加载图像而不会阻塞 UI。
【解决方案3】:
我会制作异步任务来加载数据,然后在异步任务运行时执行填充列表的任务