加载图片时无法滚动屏幕

时间:2015-05-30 03:37:17

标签: blackberry

我有以下屏幕:

class DemoScreen extends MainScreen {

private LabelField lbl1, lbl2, lbl3, lbl4, lbl5;
private BitmapField bf;
private ButtonField btn;
private String IMG_URL = "http://www.foo.bar/img/blah.jpg";

public DemoScreen(){
    bf = new BitmapField(Bitmap.getBitmapResource("img/blank.png");
    btn = new ButtonField("Click me", FOCUSABLE | ButtonField.CONSUME_CLICK);

    add(lbl1);
    add(lbl2);
    add(bf);
    add(lbl3);
    add(lbl4);
    add(lbl5);
    add(btn);
}

public void updateBitmap(){
    UiApplication.getUiApplication.invokeLater()(new Runnable(){
        public void run(){
            Bitmap bmp = BitmapUtil.loadBitmapFromURL(IMG_URL);
            bf.setBitmap(bmp);
        }
    });
}
}

一目了然地看一下代码,当显示屏幕时,首先会加载一个空白图像,然后将替换为从URL加载的真实图像。此代码在模拟器上按预期工作。但在实际设备上,有一个怪癖:在加载图像之前无法滚动屏幕(通过BitmapUtil.loadBitmapFromURL)。

我尝试将updateBitmap部分更改为:

public void updateBitmap(){
    UiApplication.getUiApplication.invokeLater()(new Runnable(){
        public void run(){
            Bitmap bmp = BitmapUtil.loadBitmapFromURL(IMG_URL);
            bf.setBitmap(bmp);
        }
    });
}

public void updateBitmap(){
    synchronized(UiApplication.getEventLock()){
        Bitmap bmp = BitmapUtil.loadBitmapFromURL(IMG_URL);
        bf.setBitmap(bmp);
    }
}

他们都没有工作。有没有办法使图像加载仍在进行时可以滚动屏幕? Ť

BTW,这是图像加载部分:

https://gist.github.com/anta40/93f1aea80d4de09ca77a

https://gist.github.com/anta40/2a8d6d8c79e4fa1530cf

1 个答案:

答案 0 :(得分:0)

您正在下载uithread上的位图。首先是因为按钮点击发生在uithread上,然后你用invokeLater包裹。

Bitmap bmp=BitmapUtil.loadBitmapFromURL(IMG_URL);阻止uithread直到下载图像。

试试这个:

public void updateBitmap()
    {
        new Thread()
        {
            public void run()
            {
                final Bitmap bmp = BitmapUtil.loadBitmapFromURL(IMG_URL);
                UiApplication.getUiApplication.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        bf.setBitmap(bmp);
                    }
                });
            }
        }.start();
     }