java - LWUIT:在后台线程中加载图像

标签 java multithreading lwuit

我有一个列表,其中包含大约 20 个图像 URL 和一些其他内容。

我想显示其他内容(描述)并允许用户在加载 20 张图像时与应用程序交互。

我注意到,无论我尝试什么,在图像加载完成之前我都无法与表单交互,即使我正在另一个线程中进行加载。

这是我现在正在使用的解决方案。

private Container createServerItems() throws Exception {
    Container list = new Container(new BoxLayout(BoxLayout.Y_AXIS));

    final int size = mediaList.size();

    final Button buttons[] = new Button[size];

    System.out.println("In here: " + size);
    for (int i = 0; i < size; i++) {
        Container mainContainer = new Container(new BorderLayout());
        Media m = new Media();
        m.fromJSONString(mediaList.elementAt(i).toString());

        buttons[i] = new Button("please wait");

        final int whichButton = i;
        Display.getInstance().callSerially(new Runnable() {

            public void run() {
                try {
                    System.out.println(MStrings.replaceAll(m.getImgURL(), "\"", ""));
                    final StreamConnection streamConnection = (StreamConnection) Connector.open(MStrings.replaceAll(m.getImgURL(), "\"", ""));                        
                    Image image = Image.createImage(streamConnection.openInputStream());
                    streamConnection.close();

                    buttons[whichButton].setText("");
                    buttons[whichButton].setIcon(image.scaled(32, 32));

                } catch (Exception e) {
                }
            }
        });
        TextArea t = new TextArea(m.getDesc());
        t.setEditable(false);
        t.setFocusable(false);
        t.setGrowByContent(true);

        mainContainer.addComponent(BorderLayout.WEST, buttons[i]);
        mainContainer.addComponent(BorderLayout.CENTER, t);

        list.addComponent(mainContainer);
    }
    return list;
}

最佳答案

方法一:LWUIT 1.5有一个强大的LWUIT4IO库来解决您的问题。

摘自Shai's Blog link

A feature in LWUIT4IO to which I didn't give enough spotlight is the cache map, its effectively a lean hashtable which stores its data using weak/soft references (depending on the platform) and falls back to storage when not enough memory is available. Its a great way to cache data without going overboard. One of the cool things about it is the fact that we use it seamlessly for our storage abstraction (which hides RMS or equivalent services) in effect providing faster access to RMS storage which is often slow on devices.

另一个有用的链接是 here

这个想法是将网络 IO 功能委托(delegate)给单例,以避免任何 UI 死锁,就像您所面临的那样。

非常好的视频演示here作者:vprise,解释了如何将 GUI 功能绑定(bind)到您的 netbeans。在此视频中,大约 7:00 分钟,它解释了 ImageDownloadService 类的使用,该类将组件绑定(bind)到其缩略图 url,该缩略图将从网络无缝获取并填充图像。

方法二:创建自定义逻辑的困难之一

  1. 创建一个单例,它将与网络交互以获取 数据
  2. 使用队列处理顺序图像下载服务
  3. 为此单例创建一个新线程并在队列中等待。
  4. 每个图像下载服务都会与调用者绑定(bind)一个监听器 组件,以便更轻松地更新正确的组件。

关于java - LWUIT:在后台线程中加载图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8422187/

相关文章:

ios - Swift:使用 NSLock 或并发队列的安全线程

java多线程两个线程尝试同时从同一对象输入流读取object()

c++ - std::atomic 加载和存储都需要吗?

java - lcdui 与 lwuit 命令区别

java - JSR-303 bean 验证 - 避免绕过字段

javascript - 多个 Rhino (java) 线程操作同一个文件

java-me - 鲁伊特闪光灯背光

java-me - 当为特定记录存储添加记录时,它也会添加到另一个记录存储!?

java - 让 Math.pow 返回正确的值?

java - 使用 Java 反射在集换式卡牌游戏中实现卡牌和效果