0

timertaskを使用してデジタル時計を更新しようとしています。時間と分を現在の時刻に設定するupdateClock()という関数を作成しましたが、定期的に実行することができませんでした。私が他の回答で読んだことから、最良のオプションの1つは、timertaskを使用することですが、Androidアクティビティ内でオンライン作業を見つけた例を作成することはできませんでした。

これは私がこれまでに書いたものです:

public class MainActivity extends Activity {
    TextView hours;
    TextView minutes;
    Calendar c;
    int cur_hours;
    int cur_minutes;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.clock_home);
        hours = (TextView) findViewById(R.id.hours);
        minutes = (TextView) findViewById(R.id.minutes);
        updateClock();
        }

    public void updateClock() {
        c = Calendar.getInstance();
        hours.setText("" + c.get(Calendar.HOUR));
        minutes.setText("" + c.get(Calendar.MINUTE));
        }

    public static void init() throws Exception {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                    updateClock(); // ERROR
                }
            }, 0, 1 * 5000);
        }
    }

どうすればそれを機能させることができますか?

4

3 に答える 3

1

runOnUiThreadを使用して、タイマースレッドからUiを更新します

timer.scheduleAtFixedRate(new TimerTask() {
     public void run() {
      MainActivity.this.runOnUiThread (new Runnable() { 
         public void run() {
             updateClock(); // call UI update method here
         }
     }));  
   }
 }, 0, 1 * 5000);
}
于 2013-01-05T07:26:48.850 に答える
0

または、RunnableをUIスレッドのハンドラーに定期的に投稿します。また、バッテリーを節約するためにタスクを一時停止および再開します。

public class MyActivity extends Activity {
    private final Handler mHandler = new Handler();
    private final Timer mTimer = new Timer();

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

        mTimer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //---update UI---
                    }
                });
            }
        },0,5000);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mTimer.cancel();
    }
}
于 2013-01-05T07:35:56.437 に答える
0

ACTION_TIME_TICK毎分更新が必要な場合は、ブロードキャストイベントを聞くこともできます。

private boolean timeReceiverAttached;
private final BroadcastReceiver timeReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        updateClock();
    }
};
private Handler handler = new Handler();

@Override
protected void onResume() {
    super.onResume();
    updateClock();
    if (!timeReceiverAttached) {
        timeReceiverAttached = true;
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_TIME_TICK);
        filter.addAction(Intent.ACTION_TIME_CHANGED);
        filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        registerReceiver(timeReceiver, filter, null, handler);
    }
}

@Override
protected void onPause() {
    super.onPause();
    if (timeReceiverAttached) {
        unregisterReceiver(timeReceiver);
        timeReceiverAttached = false;
    }
}
于 2013-01-05T07:37:52.517 に答える