如何异步显示从列表字段中的url获取的图像?我运行代码时遇到异常。这是我的代码。我得到了Uncaught NoClassFoundError
private Bitmap getBitmap(final String strEventCode)
{
if(hst.containsKey(strEventCode))
return (Bitmap) hst.get(strEventCode);
else
{
Thread t = new Thread(new Runnable()
{
public void run()
{
Bitmap bmp = HttpUtils.getBitmap(strHalfUrl+strEventCode+".jpg");
hst.put(strEventCode, bmp);
}
});
t.start();
}
return null;
}
我使用ListFieldCallBack使用以下代码绘制图像:
class ListCallBack implements ListFieldCallback
{
public void drawListRow(final ListField list, final net.rim.device.api.ui.Graphics g, final int index, final int y, final int w)
{
Event objEvent = (Event) eventData.elementAt(index);
if(list.getSelectedIndex() == index)
{
g.setColor(Color.LIGHTGRAY);
g.fillRect(0, y, getWidth(), getHeight());
}
Bitmap bmp = getBitmap(objEvent.getStrName());
if(bmp==null)
g.drawBitmap(0, y+5, loadingImage.getWidth(),loadingImage.getHeight(),loadingImage, 0, 0);
else
g.drawBitmap(0, y+5, bmp.getWidth(),bmp.getHeight(),bmp, 0, 0);
g.setColor(Color.BLACK);
int yPos = y + list.getRowHeight() - 1;
g.drawLine(0, yPos, w, yPos);
//final Bitmap b=(Bitmap)myImages.elementAt(index);
//g.drawBitmap(0, y+5, b.getWidth(),b.getHeight(),b, 0, 0);
}
public Object get(ListField list, int index)
{
return eventData.elementAt(index);
}
public int getPreferredWidth(ListField list)
{
return Display.getWidth();
}
public int indexOfList(ListField listField, String prefix, int start)
{
return eventData.indexOf(prefix,start);
}
}
答案 0 :(得分:1)
我会改变一些事情:
TooManyThreadsException
。您应该在屏幕上有一个下载图像的工作线程。您可以使用消费者 - 生产者模式:用户在向下滚动时生成图像下载请求(生产者),工作者线程(消费者)将它们排队以进行处理。您可以使用由Vector定制的LIFO结构,并在没有请求的情况下使用wait
。hst
哈希表没有线程安全性。您应该确保您的消费者是线程安全的。网上有很多关于如何做到这一点的例子。作为优化,如果你事先知道你的应用程序通常有多少个线程(不计算图像的东西),并且你知道不会超过最大线程限制,你可以有一个线程池,比方说,5个线程下载图像而不是单个工作线程。当所有5个线程都忙时,您将开始将请求排入队列。您还可以添加每个请求机制的最大时间,以防止线程忙于下载失败,因此不是在2分钟超时,而是在30秒超时并发出第二个请求。
答案 1 :(得分:0)
什么是HttpUtils.getBitmap()?如果它是为Java-SE编写的Java代码,那么它在BlackBerry上将无法正常工作,因为BlackBerry设备仅支持Java-ME,后者的功能远远低于现代Java-SE运行时。
对于异步加载,您需要在获取完成后将事件传递回UI。如果您要同时获取许多照片,您还需要为该事件添加某种批处理,因为为每张照片发送事件可能会超出UI应用程序上的事件队列。