Blackberry:提前显示警报/状态/对话框并退出

Blackberry:提前显示警报/状态/对话框并退出,blackberry,screen,alert,exit,status,Blackberry,Screen,Alert,Exit,Status,假设我有一个典型的黑莓应用程序: public class MyApp extends UiApplication { public static void main(String[] args) { MyApp app = new MyApp(); app.enterEventDispatcher(); } public MyApp() { pushScreen(new MyScreen()); } }

假设我有一个典型的黑莓应用程序:

public class MyApp extends UiApplication {
    public static void main(String[] args) {
        MyApp app = new MyApp();
        app.enterEventDispatcher();
    }

    public MyApp() {
        pushScreen(new MyScreen());
    }    
}
在开始时,我已经注意到缺少一个强制条件(错误的显示尺寸;缺少SD卡;一些IT政策等)

是否有一种方法可以向用户显示一条简短而快速的消息(以警报/状态/对话框/任何形式),并在不实例化复杂屏幕/注册加速侦听器/安装复杂CleanupRunable之前立即退出

我尝试过Dialog.alert()-它们不起作用(非事件线程调用RuntimeException“pushModalScreen”):

public类MyScreen扩展主屏幕{
公共MyScreen(){
if(Display.getWidth()<400){
状态显示(“再见”);
返回;
}
}
}

使用invokeLater代替直接调用。样本如下:

Application.getApplication().invokeLater(new Runnable() {
    public void run() {
        Dialog.inform("Your message here...");
    }
});

您可以使用Status.show()

而不是Dialog.inform。实际上,以下内容比Rafael建议的要好,因为它下面没有难看的白色屏幕。下面是我的完整示例MyApp.java:

import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.decor.*;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.image.*;

public class MyApp extends UiApplication {
    public static void main(String[] args) {
        MyApp app = new MyApp();
        app.enterEventDispatcher();
    }

    public MyApp() {
        pushScreen(new MyScreen());
    }    
}

class MyScreen extends MainScreen implements DialogClosedListener {
    Dialog myDialog = new Dialog(Dialog.OK, "Goodbye!", 0, Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION), Dialog.GLOBAL_STATUS);

    public MyScreen() {
        // XXX just some condition, like wrong dimensions or IT policy
        if (Display.getWidth() > 40) {
            myDialog.setDialogClosedListener(this);
            Application.getApplication().requestBackground();
            Application.getApplication().invokeLater(new Runnable() {
                public void run() {
                    myDialog.show();
                }
            });
            return;
        }

        // XXX heavy stuff to be skipped
    }

    public void dialogClosed(Dialog dialog, int choice) {
        if (dialog == myDialog) {
            System.out.println("XXX exiting XXX");
            System.exit(1);
        }
    }
}

谢谢Rafael,这似乎工作得很好,但我想知道在enterEventDispatcher()之前调用invokeLater()是安全的还是“幸运的”timing@Alexander,eventDispatacher()始终是最后一个要执行的对象。这是正常的行为。
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.decor.*;
import net.rim.device.api.system.*;
import net.rim.device.api.ui.image.*;

public class MyApp extends UiApplication {
    public static void main(String[] args) {
        MyApp app = new MyApp();
        app.enterEventDispatcher();
    }

    public MyApp() {
        pushScreen(new MyScreen());
    }    
}

class MyScreen extends MainScreen implements DialogClosedListener {
    Dialog myDialog = new Dialog(Dialog.OK, "Goodbye!", 0, Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION), Dialog.GLOBAL_STATUS);

    public MyScreen() {
        // XXX just some condition, like wrong dimensions or IT policy
        if (Display.getWidth() > 40) {
            myDialog.setDialogClosedListener(this);
            Application.getApplication().requestBackground();
            Application.getApplication().invokeLater(new Runnable() {
                public void run() {
                    myDialog.show();
                }
            });
            return;
        }

        // XXX heavy stuff to be skipped
    }

    public void dialogClosed(Dialog dialog, int choice) {
        if (dialog == myDialog) {
            System.out.println("XXX exiting XXX");
            System.exit(1);
        }
    }
}