Привет, ребята, я пробую пример, где у меня есть кнопка, которая загружает изображение, а затем оно должно отображаться на экране.Я использую следующий код, чтобы сделать это.Не знаю, где-то я иду неправильно.это бросает мне незаконное исключение.Может кто-нибудь, пожалуйста, посмотрите на мой код и предоставьте мне некоторую помощь.
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();
}
}