如何从Web服务器异步下载图像

时间:2012-06-06 10:45:13

标签: java design-patterns blackberry threadpool observer-pattern

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

enter image description here

到目前为止,我尝试过几种方法,

方法1:

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

方法2:

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

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

我有这个链接taskworker-thread-blackberry,但对如何达到我的要求并不太清楚。

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:4)

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

  1. 为您的应用创建一个TaskWorker(使用singelton)
  2. Task - TaskWorker实施DownloadImageTask课程(简单地将所有内容从Runnable.run()添加到Task.doTask()方法)
  3. 而不是Util.getWebData()调用TaskWorker.addTask()
  4. 中的新线程创建

    可能有更多细微的细节,但你可以弄清楚如何完成它。

    我认为最好在Callback - success(byte[] data)error(Throwable error)中使用两种方法来确定最终结果并将图像转义为String并将其转换回来。