2

時間、分、秒で時差を計算し、1 秒ごとに起動アクティビティの時間を更新する必要があります。私はこのコードを使用しています。

              private Handler handler=new Handler() ;
private Runnable updateTimeTask = new Runnable() {
    @Override
    public void run() {

            updateTime();
            //handler.postDelayed(updateTimeTask, 1000);

    }
    };          @Override
protected void onResume() {
    super.onResume();



    int delay = 1000; // delay for 1 sec.

    int period = 1000; // repeat every 4 sec.

    Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

    public void run() {

         handler.post(updateTimeTask);

    }

    }, delay, period);           }         
      private void updateTime() {

    final TextView time = (TextView) findViewById(R.id.txtViewTime);
    final TextView date = (TextView) findViewById(R.id.txtViewAlarmDesc);


    pref = new Prefs(this);
    String goal_dateTime= pref.getValue("first_goal_dateTime", "");

    Date d1 = Utils.strToDate(goal_dateTime);


    Calendar cal = Calendar.getInstance();
    if(d1!=null && d1.after(new Date()))
    {
    cal.setTime(d1);
    }
    Date cur = new Date();
    Calendar cal_cur = Calendar.getInstance();
    cal_cur.setTime(cur);


    final SimpleDateFormat formatterTime = new SimpleDateFormat("H:mm");

      long milliseconds1 = cal.getTimeInMillis();
      long milliseconds2 = cal_cur.getTimeInMillis();
      long diff = milliseconds1 - milliseconds2;
      long diffSeconds = diff / 1000;
      long diffMinutes = diff / (60 * 1000);
      long diffHours = diff / (60 * 60 * 1000);
      long diffDays = diff / (24 * 60 * 60 * 1000);


      time.setText(diffHours + " : " + diffMinutes+" : "+diffSeconds);
      date.setText(String.valueOf(diffDays+" days left to complete goal"));


}

しかし、初めてアクティビティを開始すると、正常に動作し、そこから別のアクティビティを開始して再び戻ってくると、アプリケーションがハングして黒い画面が表示され、しばらくすると ANR、keydispatchtimeout などのエラーが発生します。

別のスレッドで updateTime() を呼び出すなど、いくつかの解決策を試しましたが、「ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます」というエラーが表示されます。</p>

あらゆる種類の助けをいただければ幸いです。よろしくお願いします。

よろしく、 Munazza K

4

2 に答える 2

0

問題は、アクティビティを終了するときにコールバックを削除していないことである可能性があります。以下のように、scheduleAtFixedRateではなくpostDelayedを使用して、同じことを少し異なる方法で実装しました。

    private Handler h = new Handler();
    private static final long TIME_EVERY_SECOND = 1000;

    private Runnable onEverySecond = new Runnable() {
            public void run() {
                updateTime();
                h.postDelayed(onEverySecond, TIME_EVERY_SECOND);
            }
        };

        @Override
        public void onPause() {
            super.onPause();

            if (h != null) {
                h.removeCallbacks(onEverySecond);
            }
        }

        @Override
        public void onResume() {
            super.onResume();
            h.postDelayed(onEverySecond, TIME_EVERY_SECOND);
        }
于 2012-05-16T20:47:14.917 に答える
0

ビューを更新するには、 runOnUiThreadを使用する必要があります。

于 2012-05-16T18:57:36.913 に答える