java - Blackberry java,使用同步从非 UI 线程打开对话框

标签 java multithreading blackberry

我想从单独的线程打开一个对话框,但是当使用synchronized方式时,我收到错误。

如果我使用方法 invokeAndWait 一切正常,但我不明白为什么我不能使用 synchronized

这是我在屏幕上调用的代码:

public void Login() {

        new HttpRequestDispatcher("http://www.google.com", "GET", this) {
            public void onSuccess(byte[] baos, String contentType) {
                synchronized(UiApplication.getEventLock()){
                    Dialog.alert("Cooooooool....");
                }
            }
            public void onFail(String message){
                synchronized(UiApplication.getEventLock()){
                    Dialog.alert(message);
                }
            }
        }.start();
    }

这是 HttpRequestDispatcherThread:

public abstract class HttpRequestDispatcher extends Thread {

    String url;
    String method;
    Screen scr;

    public HttpRequestDispatcher(String url, String method, Screen scr) {
        this.url = url;
        this.method = method;
        this.scr = scr;
    }

    public abstract void onFail(String message);
    public abstract void onSuccess(byte[] baos, String contentType);
    public void beforeSend() {}
    public void onComplete() {}

    public void run() {

        beforeSend();

        try {

            HttpConnection connection = (HttpConnection) Connector.open(url);
            connection.setRequestMethod(method);

            int responseCode = connection.getResponseCode();
            if (responseCode != HttpConnection.HTTP_OK) {
                onFail(connection.getResponseMessage());
                connection.close();
                return;
            }

            String contentType = connection.getHeaderField("Content-type");
            int contentLength = (int) connection.getLength();
            if (contentLength < 0)
                contentLength = 10000;

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            InputStream responseData = connection.openInputStream();
            byte[] buffer = new byte[contentLength];
            int bytesRead = responseData.read(buffer);

            while (bytesRead > 0) {
                baos.write(buffer, 0, bytesRead);
                bytesRead = responseData.read(buffer);
            }

            baos.close();
            connection.close();

            onComplete();
            onSuccess(baos.toByteArray(), contentType);

        } catch (Exception e) {
        }
    }
}

我在模拟器中收到此错误:“JVM Error 104 Uncought: ArrayIndexOutOfBoundsException”

最佳答案

找到答案:

“无法从主事件线程以外的线程打开对话框”

Synchronized 在当前线程中执行一条语句,但持有事件锁,而 invokeAndWait 将该语句发送到事件队列,以便稍后在主事件上执行线程。

这就是为什么我的代码无法使用synchronized

这有帮助:https://stackoverflow.com/a/6515542/1680787

@Nate,你对我的 catch block 的看法绝对正确,+1 和我的坏处,刚接触黑莓。

关于java - Blackberry java,使用同步从非 UI 线程打开对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14585901/

相关文章:

java - 从 txt.file 读取并使用 java 打印出其二维数字

python - 检查当前在 python 中执行的线程

android - 如何为 BlackBerry、IOS 和 Android 集成 HTML 5?

c++ - 路径定位错误: Program "make" not found in PATH?

android - 使用Eclipse进行BB和Android开发

java - Android searchview 添加行到 ListView

java - Facelets 在哪里?

c++ - 在构造函数中创建线程

即使在 main 中的最后一条语句之后,Java 程序仍继续运行(在后台)

python - 如何实现暂停(和更多)功能?