3

別のエントリポイントから開始したバックグラウンドスレッドからグローバルダイアログをポップアップしようとしています。

public static void main(String[] args) {
    MyApp theApp = new MyApp();  
    if (args != null && args.length > 0 && args[0].equals("test")) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    synchronized (UiApplication.getEventLock()) {
                        UiEngine ui = Ui.getUiEngine();
                        Screen screen = new Dialog(Dialog.D_OK, "Test", Dialog.OK,
                                                   Bitmap.getPredefinedBitmap(Bitmap.EXCLAMATION),
                                                   Manager.VERTICAL_SCROLL);
                        ui.pushGlobalScreen(screen, 1, UiEngine.GLOBAL_MODAL);
                    }
                } catch (Exception e) {
                    System.out.println(e.toString());
                }
            }
        }).start();
    } else {
        theApp.enterEventDispatcher();
    }
}

私はそれを機能させるために非常に多くのバリエーションを試しましたが、それでも表示されません。私は試した

同期Application.getEventLock()、私も試しまし
UiApplication.getUiApplication().invokeLaterた、 UiApplication.getUiApplication().invokeAndWait。私はsynchronizing the eventlock電話をかける前に最初に試しましたinvokeLater(これは冗長だと思いますが、それでも試しました...)。何が間違っているのかわかりません。

4

1 に答える 1

2

okkサンプルデモを提供しています...。

まず、BlackBerry_App_Descriptor.xmlを編集し、 [ Application Tab ApplicationArgumentで書き込み]をalternateクリックして、起動時に[自動実行]をオンにしAlternate Entry Pointsます。[追加]をクリックして、タイトルを書き込みます。BackgroundApp

このようにUiApplicationクラスではなくApplicationクラスを拡張するクラスを作成します

 
インポートnet.rim.device.api.system.Alert;
インポートnet.rim.device.api.system.Application;
インポートnet.rim.device.api.system.Bitmap;
インポートnet.rim.device.api.ui.Manager;
インポートnet.rim.device.api.ui.Screen;
インポートnet.rim.device.api.ui.Ui;
インポートnet.rim.device.api.ui.UiEngine;
インポートnet.rim.device.api.ui.component.Dialog;


パブリッククラスBackGroundAppはApplication{を拡張します
//このクラスはバックグラウンド処理に使用されます....。

     public void startBackgroundThread()
        {{
            新しいスレッド(){
                public void run(){
                    while(true){
                        試す {
                            Thread.sleep(60000);
                        } catch(InterruptedException e){
                            e.printStackTrace();
                        }




                        同期(getEventLock()){

                            //このUiEnginepushGlobalダイアログで

                            //アプリがバックグラウンドにあるときはいつでも

                            UiEngine ui = Ui.getUiEngine();
                            画面画面=新しいダイアログ(Dialog.D_OK、 "更新があります!"、
                                    Dialog.OK、ビットマップ
                                            .getPredefinedBitmap(Bitmap.EXCLAMATION)、
                                    Manager.VERTICAL_SCROLL);
                            ui.pushGlobalScreen(screen、1、UiEngine.GLOBAL_QUEUE);

                        }
                    }
                }
            }。始める();
        }

}

このようにUiApplicationクラスを拡張するクラスを作成します

パブリッククラスGuiTestはUiApplicationを拡張します{
    静的タイマーt;

    public static void main(String [] args){

         if(args.length> 0 && "alternate" .equals(args [0])){

                            BackGroundApp app = new BackGroundApp();
                            app.startBackgroundThread();
                            app.enterEventDispatcher();

            }

         そうしないと{
             GuiTest test = new GuiTest();          
             test.enterEventDispatcher();
         }
    }
    public GuiTest(){
        Myscreen screeMyscreen = new Myscreen();
        pushScreen(screeMyscreen);
    }

}

次に、クラスMyScreenを作成し、それにすべてのUiを追加します....そして画面を押します

パブリッククラスMyscreenはMainScreenを拡張します{



    public Myscreen(){
    CreateGui();
    }

    public void CreateGui(){
       //あなたのUIはここに行きます......。
     }

}

1分後に表示されるサンプルを実行すると、アプリケーション内またはアプリケーション外に関係なく、画面にダイアログが表示されます。おかげで、これは完全な助けになるかもしれません。

于 2012-07-04T11:26:34.537 に答える