我有以下屏幕:
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,这是图像加载部分:
答案 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();
}