以基本方式实现处理程序



我在处理程序上有此示例应用程序,它会在特定时间触发日志,但是当我单击开始按钮时它似乎不起作用。下面是我的代码。

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();
            }

        });
    }
}

注意:当我单击我的按钮并实现它返回true handler.postAtTime()时,它仍然不会显示登录 DDMS,即使我已经将我的时间选择器设置为当前时间 1 分钟,它仍然不会在 DDMS 上触发日志消息

中的postAtTime方法Handler从 statup 获取以毫秒为单位的时间;而不是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)

最新更新