2014-09-27 12 views
14

पर क्रैश का कारण बनता है मेरे ऐप में मेरे पास एक दराज लेआउट का एक कस्टम कार्यान्वयन है। यह एंड्रॉइड 2.3 & 4.0.4 पर ठीक काम करता है लेकिन एंड्रॉइड 4.4 पर यह लगभग हर बार दुर्घटना खोलने या बंद करने पर दुर्घटनाग्रस्त हो जाता है।VelocityTracker एंड्रॉइड 4.4

E/AndroidRuntime(9839): FATAL EXCEPTION: main 
E/AndroidRuntime(9839): Process: com.andryr.launcher, PID: 9839 
E/AndroidRuntime(9839): java.lang.IllegalStateException: Already in the pool! 
E/AndroidRuntime(9839): at android.util.Pools$SimplePool.release(Pools.java:112) 
E/AndroidRuntime(9839): at android.util.Pools$SynchronizedPool.release(Pools.java:161) 
E/AndroidRuntime(9839): at android.view.VelocityTracker.recycle(VelocityTracker.java:85) 
E/AndroidRuntime(9839): at com.andryr.widget.DrawerLayout.onTouchEvent(DrawerLayout.java:131) 
E/AndroidRuntime(9839): at android.view.View.dispatchTouchEvent(View.java:7706) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216) 
E/AndroidRuntime(9839): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959) 
E/AndroidRuntime(9839): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2068) 
E/AndroidRuntime(9839): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1515) 
E/AndroidRuntime(9839): at android.app.Activity.dispatchTouchEvent(Activity.java:2458) 
E/AndroidRuntime(9839): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2016) 
E/AndroidRuntime(9839): at android.view.View.dispatchPointerEvent(View.java:7886) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483) 
E/AndroidRuntime(9839): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612) 
E/AndroidRuntime(9839): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) 
E/AndroidRuntime(9839): at android.os.MessageQueue.nativePollOnce(Native Method) 
E/AndroidRuntime(9839): at android.os.MessageQueue.next(MessageQueue.java:138) 
E/AndroidRuntime(9839): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime(9839): at android.app.ActivityThread.main(ActivityThread.java:5001) 
E/AndroidRuntime(9839): at java.lang.reflect.Method.invoke(Native Method) 
E/AndroidRuntime(9839): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
E/AndroidRuntime(9839): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 

और यहाँ मेरे कोड है::

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    if(!mInterceptTouchEvent) 
    { 
     return false; 
    } 
    if (ev.getAction() == MotionEvent.ACTION_DOWN 
      && ((ev.getX() < ViewConfiguration.get(getContext()) 
        .getScaledEdgeSlop() && !mExpanded) || (ev.getX() > getWidth() 
        - ViewConfiguration.get(getContext()) 
          .getScaledEdgeSlop()) 
        && mExpanded)) 
    { 
     if (mVelocityTracker == null) 
      mVelocityTracker = VelocityTracker.obtain(); 
     else 
      mVelocityTracker.clear(); 
     return true; 
    } 
    return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    if(!mInterceptTouchEvent) 
    { 
     return false; 
    } 
    mLastMotionX = ev.getX(); 
    if (mVelocityTracker == null) 
     return false; 
    switch (ev.getAction()) 
    { 
    case MotionEvent.ACTION_MOVE: 
     mVelocityTracker.addMovement(ev); 
     mVelocityTracker.computeCurrentVelocity(1000); 
     mVelocity = mVelocityTracker.getXVelocity(); 
     // ViewHelper.setTranslationX(mDrawerLayout, 
     // -mDrawerLayout.getWidth() 
     // + mLastMotionX); 
     // ViewHelper.setTranslationX(mRootView, mLastMotionX); 
     mPosition = (int) (-mDrawerLayout.getWidth() + mLastMotionX); 
     requestLayout(); 
     break; 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 

     if (Math.abs(mVelocity) > ViewConfiguration.get(getContext()) 
       .getScaledMinimumFlingVelocity() 
       && Math.abs(mVelocity) < ViewConfiguration 
         .get(getContext()).getScaledMaximumFlingVelocity()) 
     { 
      if (mVelocity > 0) 
      { 
       openDrawer(); 

      } else 
      { 
       closeDrawer(); 

      } 
     } else 
     { 
      if (mLastMotionX > getWidth()/2) 
      { 
       openDrawer(); 

      } else 
      { 
       closeDrawer(); 

      } 
     } 

     mVelocityTracker.recycle(); 
     return false; 

    } 
    return true; 
} 

लाइन 131 है:

mVelocityTracker.recycle(); 

मुझे समझ नहीं आता क्यों हो रहा है यहाँ त्रुटि लॉग है।

+0

आप समस्या का समाधान हुआ (यही कारण है कि स्वीकार किए जाते हैं जवाब @andryr से काम करता है। आप एक नया पैदा कर रहे है)? velocitytracker ऑब्जेक्ट को रीसाइक्लिंग करते समय भी मुझे वही त्रुटि मिल रही है। –

+1

mVelocityTracker.computeCurrentVelocity (1000); एक महंगा opperation है। आपको इसे ACTION_UP पर ले जाने पर विचार करना चाहिए और velocityTracker शून्य होने पर डिफ़ॉल्ट MIN_VELOCITY सेट करना चाहिए। – worked

उत्तर

23

मैं इसे रीसाइक्लिंग यह porperly

+0

कोई सुराग क्यों यह काम करता है? –

+1

रीसाइक्लिंग के बाद VelocityTracker को शून्य पर सेट नहीं कर रहा है, यह क्रैश का कारण बनता है क्योंकि दूसरी बार जब आप VelocityTracker का उपयोग करते हैं तो आप इसे दूसरी बार रीसायकल करेंगे (उसी VT को दोबारा रीसाइक्लिंग करना)। मुझे लगता है (लेकिन मुझे यकीन नहीं है) एक अन्य समाधान VelocityTracker.recycle() – andryr

+0

के बजाय VelocityTracker.clear() को कॉल करना होगा, मेरे लिए, इसे शून्य पर सेट करना काम नहीं किया। यह स्पष्ट() को कॉल करने के लिए एक बेहतर विकल्प हो सकता है, जैसे @andryr ने इंगित किया। – xip

4

डॉक्स here में metioned रूप में, आप velocityTracker.clear() कॉल करने के लिए आप इसे फिर से उपयोग करना चाहते हैं है काम करने के लिए के बाद अशक्त करने के लिए अपने velocitytracker स्थापित करने के लिए किया था।

velocityTracker.recycle() का उपयोग करें यदि आप फिर से ऑब्जेक्ट का उपयोग नहीं करेंगे- संसाधनों को मुक्त करने के लिए। ऐसा करें जब आपकी गतिविधि नष्ट हो रही है।

+0

डाउनवॉटर टिप्पणी करने की देखभाल? – vedant1811

संबंधित मुद्दे