0

If a certain user presses a floating action button for like 5 seconds i want to send out an emergency signal (calling for this test)
i found a code on stack overflow but it crashes as soon as i don't click the button for 2 seconds! im thinking the timer.cancel(); doesn't function properly... anyone got a fix for it?

this is the code:

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

I'm getting this error code:

 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.
wouter
  • 3
  • 2
  • The rest of code isn't working because `findViewById(R.id.knop3)` is null... Show a [mcve] of your code with XML – OneCricketeer Jan 19 '17 at 12:16
  • @cricket_007 could you have a look at my updated question? it would be greatly appreciated! – wouter Jan 19 '17 at 12:47
  • If you have code that crashes, show the stacktrace and a MCVE, like I linked to already. We can't just guess why this doesn't work, and we can't reproduce the problem with what you gave – OneCricketeer Jan 19 '17 at 12:50
  • @cricket_007 i updated it with the stack trace, im sorry for the inconvenience... im really really new to this haha! i did not feel the need to do an MCVE for this file since i already found the place it crashed... i just do not know how to fix it haha ;) – wouter Jan 19 '17 at 13:34
  • I found [this](http://stackoverflow.com/questions/8074666/when-a-java-timertask-is-scheduled-in-a-timer-is-it-already-executing) and it might be helpful to you. I also thought of a work-around to save the system time when in `ACTION_DOWN` and subtract it from `ACTION_UP` but that won't trigger after 2 sec, but when the user releases the button :) – Vucko Jan 19 '17 at 13:51

1 Answers1

0

From your stacktrace I can see, that Timer simply can't call callback because it was canceled

java.lang.IllegalStateException: Timer was canceled

I suggest you to use Runnable and Handler for this. In particular:

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;
            }
        });
Ekalips
  • 1,473
  • 11
  • 20