我的应用程序屏幕看起来与所附图片相似。我有多行,每行都有一个位图图像、标题和描述字段。所有信息都以 XML 的形式从我们支持的网络服务器中获取。现在,我使用了观察者设计模式,它创建了一个单独的线程来通过 HTTP 连接到我的远程服务器,下载和解析 XML。 XML 包括每行的图像、标题和描述的 URL。
到目前为止,我已经尝试了几种方法,
方法一:
- 创建了一个单独的方法 (drawRow()),该方法负责通过指定布局将内容放在一起。
- 然后,我尝试使用方法 downloadImage() 从 drawRow() 方法下载远程 URL。 但这很糟糕,因为它使用相同的线程下载并且 UI 被阻止。
方法二:
在搜索上述问题时,我遇到了 WebBitmapField在黑莓中来自 coderholic.com .
然后我使用我的 drawRow() 方法中的以下代码。据我了解 WebBitmapField,这里使用的是观察者设计模式,图像是通过 UI 线程以外的线程下载的。当我的行数有限时(如 5 或 10),它工作正常。但是当我要绘制更多行时,它会抛出 TooManyThreads
异常,因为它会为每一行创建一个新线程。
我有这个链接taskworker-thread-blackberry ,但不太清楚如何实现我的要求。
据我了解,在黑莓中,一个应用程序最多可以创建 16 个线程。所以,现在我相信了。我可能需要创建一个线程池,将最大大小指定为 10。
任何人都可以帮助我理解和实现黑莓线程池以解决我当前的问题吗?
此外,我感谢任何人给我任何其他适合我要求的最佳方法。
提前致谢。
最佳答案
您拥有所需的一切。所以:
- 为您的应用创建一个
TaskWorker
(使用singelton) - 从
TaskWorker
实现Task
类 -DownloadImageTask
(简单地说从Runnable.run()
到Task.doTask()
方法) - 不是在
Util.getWebData()
中创建新线程而是调用TaskWorker.addTask()
可能还有更多次要细节,但您可以弄清楚如何完成它。
而且我认为在 Callback
中有两个方法更好 - success(byte[] data)
和 error(Throwable error)
-确定最终结果并避免将图像转换为 String
并返回。
关于java - 如何从网络服务器异步下载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912647/