1

特定の時間にログを起動するハンドラーにこのサンプル アプリケーションがありますが、開始ボタンをクリックしたときに動作していないようです。以下は私のコードです。

public class Main extends Activity {
    private long selectedTimeInMills;
    private Handler handler;
    private static final Calendar CALENDAR = Calendar.getInstance();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TimePicker timepicker = (TimePicker) findViewById(R.id.timePicker1);
        final TextView timeText = (TextView) findViewById(R.id.time);

        Button start = (Button) findViewById(R.id.button1);
        handler = new Handler();
        String textTime = formatDate(CALENDAR.getTimeInMillis(), "hh:mm a");
        timeText.setText(textTime);

        timepicker.setOnTimeChangedListener(new OnTimeChangedListener() {

            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
                CALENDAR.set(Calendar.HOUR_OF_DAY, hourOfDay);
                CALENDAR.set(Calendar.MINUTE, minute);
                selectedTimeInMills = CALENDAR.getTimeInMillis();
                String textTime = formatDate(CALENDAR.getTimeInMillis(), "hh:mm a");
                timeText.setText(textTime);
            }
        });

        start.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Runnable runnable =  new Runnable() {

                    public void run() {
                        Log.d("HandlerCheck", "Handler Fired! @ ("+selectedTimeInMills+") "+formatDate(selectedTimeInMills, "hh:mm a"));
                    }
                };
                boolean flag = handler.postAtTime(runnable, selectedTimeInMills);

                Toast.makeText(Main.this, "Handler is Fired?:: "+flag, Toast.LENGTH_LONG).show();
            }


        });

    }
}

注:ボタンをクリックして実装するhandler.postAtTime()と、返されますtrueが、タイムピッカーを現在の時刻から1分に設定しても、DDMSのログは表示されません.DDMSのログメッセージは表示されません.

4

1 に答える 1

5

postAtTimeクラスのメソッドはHandler、起動からミリ秒単位の時間を取得します。時間ではありませんCalendar(これはあなたが通過しているものです)。SystemClock.uptimeMillis()代わりに時間を計算するために使用する必要があります。

または、関数を使用postDelayedして、設定された期間 (ミリ秒単位) 後に Runnable オブジェクトを呼び出すことができます。

// Introduce a new private variable
private long delayedTimeInMillis;

// Update delayedTimeInMillis inside onTimeChanged method:
delayedTimeInMillis = selectedTimeInMills - Calendar.getInstance().getTimeInMillis();

// replace handler.postAtTime(runnable, selectedTimeInMills); line with this:
handler.postDelayed(runnable, delayedTimeInMillis)
于 2012-09-17T03:39:57.403 に答える