【问题标题】:Implementing Handlers the basic way实现Handlers的基本方式
【发布时间】:2012-09-17 02:25:07
【问题描述】:

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

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 上的日志消息

【问题讨论】:

  • 您是否在 logcat 中看到任何错误/异常?
  • 没有任何东西被显示出来,在选定的时间过去后什么都没有发生
  • 好的,刚刚想到了一些东西。确保您在 12 小时制和 24 小时制之间没有不匹配的时间,例如,下午 3 点(12 小时)是 15 点(24 小时)。尝试记录传递到 onTimeChanged(...) 的内容以进行检查。
  • hmm onTimeChanged 总是有 24 格式,所以下午 3 点是 15,也尝试使用 System.currenttimeinmills 并将 20 秒添加到 postAtTime 仍然没有任何反应。

标签: android android-handler


【解决方案1】:

Handler 类中的postAtTime 方法从启动开始计算时间(以毫秒为单位);不是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)

【讨论】:

  • 哦,这就是 upTimeMills,我有一种预感,这就是问题所在,但我还想,这可能与 adnroid 和 java 中的所有其他时间工具相同。嗯,我会试试这个
  • 顺便说一句 @thira 我与 postDelayed 和 postAtTime 混淆了。因为我不想在某个时间触发处理程序而不是在某个时间延迟它,你能启发我吗?
  • @lemoncodes :使用 Thira 建议的 delayedTimeInMillis 方法应该可以工作。我没有意识到postAtTime 使用了自启动以来的时间。
  • 是的,它工作得很好,但我无法分析如何在我的应用程序中使用 postDelayed,我想在某个时间触发某些东西而不是延迟它......
  • @lemoncodes 根据我的经验,它们都完成了相同的任务;也就是在设定的一段时间后执行 Runnable。唯一的区别是参考点和计算时间的方式。例如,postAtTime 是以您手机的启动时间为起点计算的(因此,如果您指定 60000 毫秒,则处理程序将在您的手机启动后 60 秒后调用它,前提是您立即启动应用程序)。
猜你喜欢
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2018-11-10
相关资源
最近更新 更多