こんにちは、私は、私は画像をダウンロードし、画面上でレンダリングする必要があるボタンを持っているサンプルを試しています。私はそれを行うには、次のコードを使用しています。私は本当に間違っているどこかを知らない。それは私に違法を投げる例外。誰でも私のコードを見て、私に助けてください。nonuiスレッドからフィールドを追加すると、ブラックベリーで例外がスローされますか?
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import net.rim.device.api.system.Application;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.container.MainScreen;
public class GoogleChart extends MainScreen implements FieldChangeListener{
ButtonField btn = new ButtonField("Download");
GoogleChart activeScreen = null;
public GoogleChart() {
setTitle("Download image");
btn.setChangeListener(this);
add(btn);
this.activeScreen = (GoogleChart)UiApplication.getUiApplication().getActiveScreen();
}
public void fieldChanged(Field field, int context) {
if(field == btn){
updateUI();
}
}
private void updateUI(){
synchronized (Application.getEventLock()) {
activeScreen.add(new BitmapField(downloadImage()));
activeScreen.invalidate();
}
}
public Bitmap downloadImage() {
byte[] dataArray;
InputStream input;
StringBuffer url = new StringBuffer("IMAGE URL");
HttpConnection httpConn = null;
Bitmap googleImage = null;
try {
httpConn = (HttpConnection) Connector.open(url.toString());
input = httpConn.openInputStream();
dataArray = net.rim.device.api.io.IOUtilities.streamToBytes(input);
googleImage = Bitmap.createBitmapFromBytes(dataArray, 0, -1, 1);
} catch (IOException e) {
e.printStackTrace();
}
return googleImage;
}
}
注:画像のダウンロードは正常です。私は他のサンプルでもテストしました。
私は次のコードを変更し、ダウンロードロジックを別のスレッドに分けました。
class Download extends Thread{
Bitmap googleImage = null;
private void updateUI(){
synchronized (Application.getEventLock()) {
if(googleImage != null){
activeScreen.add(new BitmapField(googleImage));
activeScreen.invalidate();
}
}
}
public void run() {
googleImage = downloadImage();
updateUI();
}
public Bitmap downloadImage() {
byte[] dataArray;
InputStream input;
StringBuffer url = new StringBuffer("http://");
HttpConnection httpConn = null;
Bitmap googleImage = null;
try {
httpConn = (HttpConnection) Connector.open(url.toString());
input = httpConn.openInputStream();
dataArray = net.rim.device.api.io.IOUtilities.streamToBytes(input);
googleImage = Bitmap.createBitmapFromBytes(dataArray, 0, -1, 1);
} catch (IOException e) {
e.printStackTrace();
}
return googleImage;
}
}
とあなたが完了するまで、アプリケーション全体をロックする(イベントロックをキャプチャして、ダウンロードを行っている。 あなたのダウンロードをオフに実行するためにスレッドを使用する必要があり、この
public void fieldChanged(Field field, int context) {
if(field == btn){
new Download().start();
}
}
例外はイメージサイズまたはメモリの制約によるものではありません。それは、ネットワークスレッドから、UIにフィールドを追加している間です。 –
@Neel:UPDATEセクションを参照 –
Arhimed ..ありがとう。今働いている。 –