来自JSON的黑莓线程图像

时间:2012-06-09 18:25:30

标签: multithreading image blackberry bitmap listfield

我正在寻找一种从后台线程在ListField上显示图像的方法。首先在我的drawListRow中尝试这个

path = (String) imagePaths.elementAt(index);
bit = connectServerForImage(path);

g.drawBitmap(xText, y + yText, 80, 200, bit, 0, 0);

但无法在整个列表中顺畅滚动,they表示不在UI上进行网络或其他阻止操作。但我也试试这个

private class imgConnection extends Thread
{      
        public imgConnection() {
                super();
        }

        public void run() {            

                try {
                    for (int i = 0; i < imagePaths.size(); i++)
                    {
                        final int index = i;                              
                        String path = imagePaths.elementAt(index).toString();
                        bit = connectServerForImage(path);
                        image.addElement(bit);

                    }
                }
                catch (Exception e)
                {
                    System.out.println(e.toString());                        
                }

                UiApplication.getUiApplication().invokeLater(new Runnable() {
                        public void run() {        
                        _list.setSize(image.size());
                        subManager.add(_list);                        
                        screen.invalidate();
                        }  
                        });


        }
}

public void drawListRow(ListField list, Graphics g, int index, int y, int w) {
    bit = (Bitmap) image.elementAt(index);
    g.drawBitmap(xText, y + yText, 80, 200, bit, 0, 0);
}

但没有任何反应。任何想法,评论。


你是对的,我刚开始java开发2周前特别是BB开发,我试试这个link。我想从json return获取路径url后添加后台线程来下载图像。

第一个帖子:

_connectionthread = new Connection();
_connectionthread.start();

private class Connection extends Thread
{
    public Connection()
    {
       super();
    }

    public void run() {      
        try {}
        catch (Exception e) {}
    } 
}

第二个帖子:

_imgConnectionThread = new ImgConnection();
_imgConnectionThread.start();

private class ImgConnection extends Thread
{      
        public ImgConnection() {
           super();
        }

        public void run() {            
                try {
                }
                catch (Exception e)
                {
                }

        }
}

如何在ListField上更新图像?

2 个答案:

答案 0 :(得分:2)

答案基于 - pastebin.com/90UKTHzP

的代码

糟糕的代码!它真的很难读懂而且难以理解!看起来您从不同位置复制粘贴的几个示例。您也可以使用相同的行为覆盖默认行为。 MainScreen也已经有了VerticalManagerField。此外,您每次迭代都会向管理器添加列表,这将导致IAE。主要的一个线程取决于第二个的结果。它们同时启动,但是从服务器获取json并且它的处理可能需要更长的时间,因此图像线程最有可能完成其运行而没有任何结果。

所以修复它的主要建议 - 阅读clean code book!阅读有关java development - 约定,多线程的更多信息。阅读BB development - UI api,网络。

最后 - 只启动一个线程来获取和解析json。完成后 - 启动另一个线程来获取图像。

还有一些小的东西可以节省更多的电池和处理器时间 - 开始按需加载图像 - 当它绘制或将要绘制时(用户滚动列表)。

答案 1 :(得分:1)

按照惯例,Java类名称以大写字母开头,因此imgConnection应该是ImgConnection。

在您的示例代码中,我没有看到imgConnection在任何地方被实例化,并且我没有看到对Thread.start()的任何调用,这是我开始的线程的方式。没有Thread.start()就不会发生任何事情 - 线程永远不会启动。