1

以下のコードを使用して、Blackberry アプリケーションで「お待ちください」ポップアップを作成しています。デバイスのバック プレスでそのポップアップ画面を削除したいのですが、表示時にポップアップを待ってください画面全体が完了するまでブロックされているため、これを行うことができません。スレッド操作の。

これが私のコードです:

public class PleaseWaitLoginPopupScreen extends PopupScreen {

    //statics ------------------------------------------------------------------

    private AnimatedGIFField _ourAnimation = null;
    private LabelField _ourLabelField = null;
    private static String pleaseWaitText="";
    private static PleaseWaitLoginPopupScreen ref;

    public static PleaseWaitLoginPopupScreen getInstance(){
        if(ref!=null){
            ref=new PleaseWaitLoginPopupScreen(Constant.PLEASE_WAIT_TEXT);
        }
        return ref;
    }

    public PleaseWaitLoginPopupScreen(String text) {
        super(new VerticalFieldManager(VerticalFieldManager.VERTICAL_SCROLL | VerticalFieldManager.VERTICAL_SCROLLBAR));
        GIFEncodedImage ourAnimation = (GIFEncodedImage) GIFEncodedImage.getEncodedImageResource("loader.gif");
        _ourAnimation = new AnimatedGIFField(ourAnimation, Field.FIELD_HCENTER);
        this.add(_ourAnimation);
        _ourLabelField = new LabelField(text, Field.FIELD_HCENTER);
        this.add(_ourLabelField);
    }

    public static void showScreenAndWait(final Runnable runThis, String text) {
        pleaseWaitText=text;
        final PleaseWaitLoginPopupScreen thisScreen = new PleaseWaitLoginPopupScreen(text);
        Thread threadToRun = new Thread() {
            public void run() {
                // First, display this screen
                UiApplication.getUiApplication().invokeLater(new Runnable() {
                    public void run() {
                        UiApplication.getUiApplication().pushScreen(thisScreen);
                    }
                });
                boolean exceptionFlag = false;
                // Now run the code that must be executed in the Background
                try {
                    runThis.run();
                } catch (Throwable t) {
                    exceptionFlag = true;
                    t.printStackTrace();
                    //throw new RuntimeException("Exception detected while waiting: " + t.toString());

                }finally{
                    // Now dismiss this screen
                    if(exceptionFlag){//IF EXCEPTION OCURES THAN THIS CODE WILL RUN TO STOP THE PLEASE WAIT POP TASK
                        UiApplication.getUiApplication().invokeLater(new Runnable() {
                            public void run() {
                                UiApplication.getUiApplication().popScreen(thisScreen);
                            }
                        });
                    }
                }
            }
        };
        threadToRun.start();
    }

    public void dismissPopupScreen(){
        UiApplication.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                UiApplication.getUiApplication().popScreen(PleaseWaitLoginPopupScreen.this);
            }
        });
        /*synchronized (UiApplication.getEventLock()) {
            UiApplication.getUiApplication().popScreen(PleaseWaitLoginPopupScreen.this);
        }*/
    }
}
4

1 に答える 1

3

Back (ESC) キーの押下をキャッチし、それを使用してポップアップ画面を閉じたい場合は、クラスで keyChar(char,int,int)メソッドをオーバーライドできます。PleaseWaitLoginPopupScreen

   protected boolean keyChar(char c, int status, int time) {
      if (c == Characters.ESCAPE) {
         close();
      }
      return super.keyChar(c, status, time);
   }

ただし、これは単にポップアップ画面を削除するだけです。おそらく、Runnable開始した を停止することも試みてください。BlackBerry Java では、これは、停止を要求するコードとRunnableそれ自体の間で協力して行う必要があります。

詳細については、Arhimed によるこの回答を参照してください。

あなたの場合、Thread変数をメンバーとして保存できます

private Thread _threadToRun; 

で割り当てますshowScreenAndWait()

thisScreen._threadToRun = new Thread() {

そして、私がこれで示した方法でそれをキャンセルkeyChar()します:

   protected boolean keyChar(char c, int status, int time) {
      if (c == Characters.ESCAPE) {
         _threadToRun.interrupt();
         close();
      }
      return super.keyChar(c, status, time);
   }

次に、 にRunnable()渡す でshowScreenAndWait()、スレッドが中断されたかどうかを確認するために、いくつかのチェックを行う必要があります。

 if (!Thread.currentThread().isInterrupted()) {
     // do more stuff
 }

これらのチェックをどのように配置するかは、タスクによって異なります。メソッドで10 個のファイルをダウンロードする場合は、10 個のダウンロードのそれぞれの間にチェックをrun()入れる必要があります。isInterrupted()ループが含まれている場合run()は、while()ループごとに 1 回チェックします。これにより、いつジョブを停止できるかが決まります。

于 2013-03-14T22:28:02.543 に答える