Search code examples
androidnullpointerexceptionandroid-viewpagerandroid-bitmap

ViewPager fast swipes causes crash


I have that weird error with ViewPager - when I swipe it slow it's all good, but when I do that fast it crashes. This one causes crashes (NullPointerException):

Bitmap hotspots = Bitmap.createBitmap(img.getDrawingCache());

Whole method:

public int getHotspotColor(int hotspotId, int x, int y) {
        ImageView img = (ImageView) itemView.findViewById(hotspotId);
        img.setDrawingCacheEnabled(true);
        //img.buildDrawingCache(); //update
        Bitmap hotspots = Bitmap.createBitmap(img.getDrawingCache());
        img.setDrawingCacheEnabled(false);

        return hotspots.getPixel(x, y);
    }

Mainly, after two or three fast-paced swipes it crashes. Is it to slow?

LogCat:

12-18 18:50:21.831: E/InputEventReceiver(12924): Exception dispatching input event.
12-18 18:50:21.832: E/MessageQueue-JNI(12924): Exception in MessageQueue callback: handleReceiveCallback
12-18 18:50:21.846: E/MessageQueue-JNI(12924): java.lang.NullPointerException
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.graphics.Bitmap.createBitmap(Bitmap.java:639)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at pl.dajsiezlapac.apka.ViewPagerAdapter.getHotspotColor(ViewPagerAdapter.java:156)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at pl.dajsiezlapac.apka.ViewPagerAdapter$1.onTouch(ViewPagerAdapter.java:78)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.View.dispatchTouchEvent(View.java:7731)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2212)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2240)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.app.Activity.dispatchTouchEvent(Activity.java:2466)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.View.dispatchPointerEvent(View.java:7916)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4023)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3902)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3479)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3479)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5657)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5588)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5559)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5737)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.os.MessageQueue.nativePollOnce(Native Method)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.os.MessageQueue.next(MessageQueue.java:138)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.os.Looper.loop(Looper.java:123)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at android.app.ActivityThread.main(ActivityThread.java:5086)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at java.lang.reflect.Method.invokeNative(Native Method)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at java.lang.reflect.Method.invoke(Method.java:515)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
12-18 18:50:21.846: E/MessageQueue-JNI(12924):  at dalvik.system.NativeStart.main(Native Method)
12-18 18:50:21.846: D/AndroidRuntime(12924): Shutting down VM
12-18 18:50:21.848: W/dalvikvm(12924): threadid=1: thread exiting with uncaught exception (group=0x41704d40)
12-18 18:50:21.856: E/AndroidRuntime(12924): FATAL EXCEPTION: main
12-18 18:50:21.856: E/AndroidRuntime(12924): Process: pl.dajsiezlapac.apka, PID: 12924
12-18 18:50:21.856: E/AndroidRuntime(12924): java.lang.NullPointerException
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.graphics.Bitmap.createBitmap(Bitmap.java:639)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at pl.dajsiezlapac.apka.ViewPagerAdapter.getHotspotColor(ViewPagerAdapter.java:156)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at pl.dajsiezlapac.apka.ViewPagerAdapter$1.onTouch(ViewPagerAdapter.java:78)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.View.dispatchTouchEvent(View.java:7731)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2212)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2240)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.app.Activity.dispatchTouchEvent(Activity.java:2466)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.View.dispatchPointerEvent(View.java:7916)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4023)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3902)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3578)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3479)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3635)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3502)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3471)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3479)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3452)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5657)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5588)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5559)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5737)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.os.MessageQueue.nativePollOnce(Native Method)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.os.MessageQueue.next(MessageQueue.java:138)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.os.Looper.loop(Looper.java:123)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at android.app.ActivityThread.main(ActivityThread.java:5086)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at java.lang.reflect.Method.invokeNative(Native Method)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at java.lang.reflect.Method.invoke(Method.java:515)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
12-18 18:50:21.856: E/AndroidRuntime(12924):    at dalvik.system.NativeStart.main(Native Method)
12-18 18:50:23.113: I/Process(12924): Sending signal. PID: 12924 SIG: 9

Snippet where I use getHotspotId() method:

@Override
    public Object instantiateItem(ViewGroup container, final int position) {

        // Declare Variables
        final ImageView imggun;  

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        itemView = inflater.inflate(R.layout.viewpager_item, container,
                false);
        FrameLayout layout = (FrameLayout) itemView.findViewById(R.id.fl1);
        layout.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent ev) {
                final int action = ev.getAction();
                final int evX = (int) ev.getX();
                final int evY = (int) ev.getY();
                switch (action) {
                case MotionEvent.ACTION_DOWN:

                    int touchColor = getHotspotColor(R.id.buttons, evX, evY);
                    ColorTool ct = new ColorTool(); //line 83
                    int tolerance = 25;
...
}

Solution

  • App was crashing because it was in MotionEvent.ACTION_DOWN event which activated it every time You put Your finger on screen.

    On the other hand if You put it in MotionEvent.ACTION_UP section if You put down Your finger on screen AND swipe then no ACTION_UP will be noticed and this is the place where getHotspotId() should be.

    So, the code was right - the placement of it not so quite. Thanks for all the help!