1

サーバープラットフォームへのレポートの送信をスケジュールするために、多数のタイマーを備えた BlackBerry アプリを使用しています。レポートに優先順位を付けるようにロジックを変更するまで、すべて正常に機能しています。したがって、たとえば、レポート A がオンになっていて、ユーザーがレポート B もアクティブにすると、レポート B のみが通過し、レポート B がアクティブになるまでレポート A が停止するかどうかを確認しています。B が無効になると (タイマーがキャンセルされます)、レポート A が再開されます。ただし、コードがキャンセル タイマー タスク コードでループする場合でも、レポート A は処理を続けますが、レポート B はまだアクティブ化されています。

FieldChangeListener reportingListener = new FieldChangeListener() {   
        public void fieldChanged(Field field, int context) 
        {
            try {

            if (field == slider) {
                int i = slider.getValue();
                if(i==0) 
                    lblInterval.setText(1+" minute");
                if(i==1) 
                    lblInterval.setText(2+" minutes");
                if(i==2) 
                    lblInterval.setText(5+" minutes");
                if(i==3) 
                    lblInterval.setText(10+" minutes");
                if(i==4) 
                    lblInterval.setText(15+" minutes");
                if(i==5) 
                    lblInterval.setText(30+" minutes");
                if(i==6) 
                    lblInterval.setText(1+" hour");
                if(i==7) 
                    lblInterval.setText(2+" hours");
                if(i==8) 
                    lblInterval.setText(6+" hours");
                if(i==9) 
                    lblInterval.setText(12+" hours");
                if(i==10) 
                    lblInterval.setText(24+" hours");
                setSliderPosition(i);
                value=setLblIntervalValue(i);
                value2=setGpsTimerIntervalValue(i);
                gpsReportValue=lblInterval.getText();
                gpsIntervalValue1=setGpsTimerIntervalValue(i);
            }

            if (PersistentStoreHelper.persistentHashtable.containsKey("image")) 
                 {
            boolean trackONOFFImage = ((Boolean) PersistentStoreHelper.persistentHashtable.get("image")).booleanValue();
            if(trackONOFFImage==true)
            {
                if (PersistentStoreHelper.persistentHashtable.containsKey("panic"))
                 {
                     boolean panicImage = ((Boolean)PersistentStoreHelper.persistentHashtable.get("panic")).booleanValue();
                     if(panicImage==true)
                     {
                         MyScreen.currentlyReporting.setText("PANIC ALARM TRIGGERED");
                         if (PersistentStoreHelper.persistentHashtable.containsKey("tabTrackValid"))
                     {
                         boolean trackingTab = ((Boolean)PersistentStoreHelper.persistentHashtable.get("tabTrackValid")).booleanValue();
                         if(trackingTab==false)
                         {
                            trackSlider.cancel();
                         }
                        PersistentStoreHelper.persistentHashtable.put("tabTrackValid", Boolean.TRUE);
                     }

                     }
                     else
                     {
                        //int gpsIntervalValue1=setGpsTimerIntervalValue(i);
                    if (PersistentStoreHelper.persistentHashtable.containsKey("gpsTimerIntervalValue")) 
                     {
                        String intervalValue=((String)PersistentStoreHelper.persistentHashtable.get("gpsTimerIntervalValue"));
                        if(gpsIntervalValue1==Integer.parseInt(intervalValue))
                        {
                            //do nothing
                        }
                        else
                        {
                            trackSlider = new TimerTask() {
                                 public void run() {

                                    try {
                                        UiApplication.getUiApplication().invokeLater(new Runnable() 
                                        {
                                            public void run() {
                                               //Dialog.alert("Invalid login details");
                                            }
                                        });
                                        sendTrackingReport();
                                    } catch (Exception e) {
                                        Dialog.alert("Unable to track at the new interval set");
                                    }

                                 }
                              };
                              //trackSlider.run();
                              trackingTimerSlider.scheduleAtFixedRate(trackSlider , 0, gpsIntervalValue1);
                             PersistentStoreHelper.persistentHashtable.put("tabTrackValid", Boolean.FALSE);
                        }
                     }
                     }
                 }

            }//this
                }

        } catch (IllegalStateException e) {
            //Dialog.alert("CANCEL TRACK1");
            e.printStackTrace();
        } catch (NullPointerException e) {
            //Dialog.alert("CANCEL TRACK2");
            e.printStackTrace();
        }
        }   
     }; 

注: レポート A = 追跡。レポート B = パニック。パニックはトラッキングよりも優先されます。スライダーはタイマー間隔の値を変更しています。

コードをデバッグしたところ、ループに入り、要求されたレポートのタイマー タスクがキャンセルされましたが、それらのレポートが処理されていることがわかります。タイマーを正しくキャンセルしていませんか? ご意見をお聞かせください。

4

1 に答える 1

4

TimerTask.canceljavadocから:

... タスクが繰り返し実行されるようにスケジュールされている場合、再度実行されることはありません。(この呼び出しが発生したときにタスクが実行されている場合、タスクは最後まで実行されますが、再度実行されることはありません。) ...

まず、cancelご覧のとおり、スレッドから呼び出してもタイマー スレッドはすぐには停止しません。

また、画面で毎回新しいタイマーを作成しています。

trackSlider = new TimerTask()

したがって、アプリの実行中に画面のインスタンスを複数作成すると、同じタイプのタイマーが複数作成される可能性があります。

于 2013-02-21T14:30:28.553 に答える