java - 如何从网络服务器异步下载图片

标签 java design-patterns blackberry threadpool observer-pattern

我的应用程序屏幕看起来与所附图片相似。我有多行,每行都有一个位图图像、标题和描述字段。所有信息都以 XML 的形式从我们支持的网络服务器中获取。现在,我使用了观察者设计模式,它创建了一个单独的线程来通过 HTTP 连接到我的远程服务器,下载和解析 XML。 XML 包括每行的图像、标题和描述的 URL。

enter image description here

到目前为止,我已经尝试了几种方法,

方法一:

  • 创建了一个单独的方法 (drawRow()),该方法负责通过指定布局将内容放在一起。
  • 然后,我尝试使用方法 downloadImage() 从 drawRow() 方法下载远程 URL。 但这很糟糕,因为它使用相同的线程下载并且 UI 被阻止。

方法二:

在搜索上述问题时,我遇到了 WebBitmapField在黑莓中来自 coderholic.com .

然后我使用我的 drawRow() 方法中的以下代码。据我了解 WebBitmapField,这里使用的是观察者设计模式,图像是通过 UI 线程以外的线程下载的。当我的行数有限时(如 5 或 10),它工作正常。但是当我要绘制更多行时,它会抛出 TooManyThreads 异常,因为它会为每一行创建一个新线程。

我有这个链接taskworker-thread-blackberry ,但不太清楚如何实现我的要求。

据我了解,在黑莓中,一个应用程序最多可以创建 16 个线程。所以,现在我相信了。我可能需要创建一个线程池,将最大大小指定为 10。

任何人都可以帮助我理解和实现黑莓线程池以解决我当前的问题吗?

此外,我感谢任何人给我任何其他适合我要求的最佳方法。

提前致谢。

最佳答案

您拥有所需的一切。所以:

  1. 为您的应用创建一个TaskWorker(使用singelton)
  2. TaskWorker 实现 Task 类 - DownloadImageTask(简单地说从 Runnable.run()Task.doTask() 方法)
  3. 不是在 Util.getWebData() 中创建新线程而是调用 TaskWorker.addTask()

可能还有更多次要细节,但您可以弄清楚如何完成它。

而且我认为在 Callback 中有两个方法更好 - success(byte[] data)error(Throwable error) -确定最终结果并避免将图像转换为 String 并返回。

关于java - 如何从网络服务器异步下载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10912647/

相关文章:

Java:删除另一个类中的 Activity 键监听器

java - Java 中复杂的异常处理

C中的契约(Contract)设计模式

wpf - 自定义 WPF 命令模式示例

android - Android、Windows Phone 7 和 Blackberry 的等效配置文件 (iOS)

java - 如何将Java swing黑色背景工具栏集成到polaxes中?

java - 不推荐使用的 API 和旧版 API 之间的区别?

java - Kafka Consumer架构设计 : java plugin or external client

java - 黑莓中的文件处理

java - 无法通过双击打开 .cod 文件