【问题标题】:Press button for a certain amount of time to trigger activity按下按钮一定时间触发活动
【发布时间】:2017-06-04 03:17:42
【问题描述】:

如果某个用户按下浮动操作按钮大约 5 秒钟,我想发出紧急信号(要求进行此测试)
我在堆栈溢出上找到了一个代码,但是只要我不点击按钮 2 秒钟,它就会崩溃!我在想 timer.cancel();无法正常运行...有人解决了吗?

这是代码:

FloatingActionButton floatingactionknop = (FloatingActionButton) findViewById(R.id.knop3);
            final Timer timer = new Timer();
            floatingactionknop.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View arg0, MotionEvent arg1) {
                    switch (arg1.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            //start timer
                            timer.schedule(new TimerTask() {
                                @Override
                                public void run() {
                                    Intent callintent = new Intent(getIntent().ACTION_DIAL);
                                    callintent.setData(Uri.parse("tel:zuster"));
                                    startActivity(callintent);
                                }
                            }, 2000);
                            return true;
                        case MotionEvent.ACTION_UP:
                            //stop timer
                            timer.cancel();
                            return true;
                    }
                    return false;
                }
            });

我收到此错误代码:

 E/InputEventReceiver: Exception dispatching input event.
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
E/MessageQueue-JNI: java.lang.IllegalStateException: Timer was canceled
                        at java.util.Timer.scheduleImpl(Timer.java:558)
                        at java.util.Timer.schedule(Timer.java:456)
                        at com.asiancorp.dezorggroep.MainActivity$2.onTouch(MainActivity.java:79)
                        at android.view.View.dispatchTouchEvent(View.java:9290)
                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                        at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                        at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                        at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
                        at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
                        at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
                        at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                        at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                        at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
                        at android.view.View.dispatchPointerEvent(View.java:9514)
                        at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
                        at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                        at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                        at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                        at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                        at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                        at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                        at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                        at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
                        at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
                        at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
                        at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6025)
                        at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                        at android.os.MessageQueue.nativePollOnce(Native Method)
                        at android.os.MessageQueue.next(MessageQueue.java:323)
                        at android.os.Looper.loop(Looper.java:135)
                        at android.app.ActivityThread.main(ActivityThread.java:5417)
                        at java.lang.reflect.Method.invoke(Native Method)
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.asiancorp.dezorggroep, PID: 7050
                  java.lang.IllegalStateException: Timer was canceled
                      at java.util.Timer.scheduleImpl(Timer.java:558)
                      at java.util.Timer.schedule(Timer.java:456)
                      at com.asiancorp.dezorggroep.MainActivity$2.onTouch(MainActivity.java:79)
                      at android.view.View.dispatchTouchEvent(View.java:9290)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                      at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553)
                      at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2197)
                      at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403)
                      at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737)
                      at android.app.Activity.dispatchTouchEvent(Activity.java:2765)
                      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                      at android.support.v7.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:71)
                      at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364)
                      at android.view.View.dispatchPointerEvent(View.java:9514)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4230)
                      at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4096)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                      at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3787)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                      at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3844)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                      at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3695)
                      at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3661)
                      at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3669)
                      at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3642)
                      at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5922)
                      at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5896)
                      at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5857)
                      at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6025)
                      at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
                      at android.os.MessageQueue.nativePollOnce(Native Method)
                      at android.os.MessageQueue.next(MessageQueue.java:323)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Application terminated.

【问题讨论】:

  • 其余代码不起作用,因为 findViewById(R.id.knop3) 为空... 使用 XML 显示您的代码的 minimal reproducible example
  • @cricket_007 你能看看我更新的问题吗?将不胜感激!
  • 如果您有崩溃的代码,请显示堆栈跟踪和 MCVE,就像我已经链接到的那样。我们不能只是猜测为什么这不起作用,我们也无法用您提供的内容重现问题
  • @cricket_007 我用堆栈跟踪更新了它,很抱歉给您带来不便……我真的很陌生哈哈!我觉得没有必要为这个文件做一个 MCVE,因为我已经找到了它崩溃的地方......我只是不知道如何修复它哈哈;)
  • 我找到了this,它可能对你有帮助。我还想到了一种解决方法,以在 ACTION_DOWN 中节省系统时间并从 ACTION_UP 中减去它,但这不会在 2 秒后触发,但是当用户释放按钮时:)

标签: java android nullpointerexception


【解决方案1】:

从您的堆栈跟踪中我可以看到,Timer 根本无法调用回调,因为它已被取消

java.lang.IllegalStateException: Timer was canceled

我建议您为此使用 Runnable 和 Handler。特别是:

Handler h = new Handler();
Runnable r = new Runnable() {
                @Override
                public void run() {
                    Intent callintent = new Intent(getIntent().ACTION_DIAL);
                    callintent.setData(Uri.parse("tel:zuster"));
                    startActivity(callintent);
                }
            }



floatingactionknop.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View arg0, MotionEvent arg1) {
                switch (arg1.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        //start timer
                        h.postDelayed(r,2000);
                        return true;
                    case MotionEvent.ACTION_UP:
                        //stop timer
                        h.removeCallbacks(r);
                        return true;
                }
                return false;
            }
        });

【讨论】:

  • Np,我的朋友)
猜你喜欢
  • 1970-01-01
  • 2022-01-09
  • 2023-03-03
  • 2022-07-21
  • 1970-01-01
  • 2013-10-11
  • 2017-12-27
  • 2020-08-16
  • 1970-01-01
相关资源
最近更新 更多