【问题标题】:Android Handler.postDelayed only working onceAndroid Handler.postDelayed 只工作一次
【发布时间】:2020-09-06 06:17:39
【问题描述】:

我正在编写一个 WearOS 应用程序,它试图通过振动来告诉时间。 (例如,如果时间是 4:12,它将振动 4 次,然后 1 次,然后 2 次) 我怀疑这有很多实际用途,但我这样做是为了了解 Android 应用程序开发。

我正在尝试使用 handler.postDelayed 来延迟振动之间的延迟,但这只能工作一次。在它成功触发一次处理程序后,我需要重新启动活动以使其再次工作。为什么?

我的相关代码在这里:

    int[] pulses = new int[4]; //length 4, one for each possible digit of the time

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //some init code goes here
        Calendar cal = Calendar.getInstance();
        int hour = cal.get(Calendar.HOUR);
        int minute = cal.get(Calendar.MINUTE);

        pulses[0] = hour/10;
        pulses[1] = hour%10;
        pulses[2] = minute/10;
        pulses[3] = minute%10;

        RelativeLayout parent_layout = findViewById(R.id.parent_layout);
        parent_layout.setOnTouchListener(new TotalGestureDetector(this){
            @Override
            public void onDoubleTap(MotionEvent e) {
                Toast.makeText(getApplicationContext(), "Double-Tap", Toast.LENGTH_SHORT).show();
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        int time = vibratePattern();
                        if (time < 0){
                            return; //no need to re-call the function
                        }
                        new Handler().postDelayed(this, time);
                        return;
                    }
                }, 500);

            }
        });

    private int vibratePattern(){
        int pulse_len = 130;
        int pause_len = 100;
        int delay_between_digits = 1250;
        for(int i = 0; i < pulses.length; i++){
            if (pulses[i] > 0){
                pulses[i]--;
                buzz(pulse_len);
                return pulse_len + pause_len;
            } else if( pulses[i] == 0){
                //don't vibrate, insert delay between digits
                pulses[i]--; //set this to -1 so we know it is acted upon
                return delay_between_digits;
            } else {
                //Do nothing, let the loop continue to the next digit in the time.
            }
        }
        //if it ever gets here, array is empty
        //return -1 to show that no more calls are needed
        return -1;
    }

抱歉,代码太多了。

buzz 只是我拥有的一个功能,它会根据给定的毫秒数振动设备

TotalGestureDetector 是我刚刚从这里 yoinked 的一个类:https://gist.github.com/nesquena/b2f023bb04190b2653c7 并重命名。

parent_layout 实际上只是一个空活动中的默认布局——屏幕是空白的 我希望这个应用程序是仅振动的。

【问题讨论】:

  • (例如,如果时间是 4:12,它将振动 4 次,然后 1 次,然后 2 次)您的解决方案工作 7 次以防万一,它不会再次发生,对吗?跨度>

标签: java android android-handler postdelayed


【解决方案1】:

pulses 已经全部振动时,您应该再次恢复它的值。试试这个

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        int time = vibratePattern();
        if (time < 0){
            pulses[0] = hour/10;
            pulses[1] = hour%10;
            pulses[2] = minute/10;
            pulses[3] = minute%10;
            return; //no need to re-call the function
        }
        new Handler().postDelayed(this, time);
        return;
    }
}, 500);

【讨论】:

  • 啊啊啊红鲱鱼。我担心为什么 postDelayed 不起作用,并没有考虑到我的函数正在改变列表,然后在下次调用时没有任何事情可做。
  • 应该使 Handle() 全局变量而不是 Runnable 中的新对象 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多