Attempted to Finish an Input Event ...
1 min read

Attempted to Finish an Input Event ...

Attempted to Finish an Input Event ...

... but input event receiver has already been disposed.

This is the error I got while trying to do something off a menu in Android. Silly really. The message is not too revealing so I ended up scouring the net for an answer and scratching my head afterwards...

With a service

My problem was trying to launch a service; I figured it out with a single step:

Disable the filter in Android Studio (logcat). Then, just before this message, I got another one:

03-16 20:51:10.601      468-788/system_process W/ActivityManager﹕ \
Unable to start service Intent { \
    cmp=com.laurivan.android.testapp.dev/com.laurivan.android.testapp.services.MyIntentService \
} U=0: not found

which gave me the real reason: I forgot to add the service to my manifest file. Lesson learned.

With a button

This question refers to the same problem, but in a different scenario: a button's event displaying a Toast.

My solution involves the same "disable the filter" from above and see the real reason.

To decouple the Toast from an ephemeral widget, I have a solution; write a wrapper:

public class DisplayToast implements Runnable {
    private final Context mContext;
    private final String mText;

    public DisplayToast(Context mContext, String text) {
        this.mContext = mContext;
        mText = text;
    }

    public void run() {
        Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
    }
}

and use it via a Handler object, e.g.:

mhandler = new Handler();
mhandler.postDelayed(new DisplayToast(getApplicationContext(), "Epic message!"), 100 /* ms */);

This way, even if the source goes away, the Toast gets shown.