zoukankan      html  css  js  c++  java
  • bug_ _ java.lang.IllegalArgumentException: pointerIndex out of range 问题的两种解决办法

    ========== 4     如何解决java.lang.IllegalArgumentException: pointerIndex out of range?

    今天遇到一个bug:java.lang.IllegalArgumentException: pointerIndex out of range

    	at android.view.MotionEvent.nativeGetAxisValue(Native Method)
    	at android.view.MotionEvent.getX(MotionEvent.java:1981)
    	at android.support.v4.view.MotionEventCompatEclair.getX(MotionEventCompatEclair.java:32)
    	at android.support.v4.view.MotionEventCompat$EclairMotionEventVersionImpl.getX(MotionEventCompat.java:91)
    	at android.support.v4.view.MotionEventCompat.getX(MotionEventCompat.java:219)
    	at android.support.v4.view.ViewPager.onTouchEvent(ViewPager.java:1901)
    	at cn.xs8.app.activity.news.ui.CustomViewPager.onTouchEvent(CustomViewPager.java:29)
    	at android.view.View.dispatchTouchEvent(View.java:7263)
    	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2235)
    	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1932)
    	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
    	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
    	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
    	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
    	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
    	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
    	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2241)
    	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1946)
    	at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1977)
    	at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1427)
    	at android.app.Activity.dispatchTouchEvent(Activity.java:2428)
    	at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1925)
    	at android.view.View.dispatchPointerEvent(View.java:7443)
    	at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3603)
    	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3531)
    	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4783)
    	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4743)
    	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4895)
    	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179)
    	at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
    	at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:171)
    	at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:4863)
    	at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:4917)
    	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:776)
    	at android.view.Choreographer.doCallbacks(Choreographer.java:579)
    	at android.view.Choreographer.doFrame(Choreographer.java:546)
    	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:762)
    	at android.os.Handler.handleCallback(Handler.java:800)
    	at android.os.Handler.dispatchMessage(Handler.java:100)
    	at android.os.Looper.loop(Looper.java:194)
    	at android.app.ActivityThread.main(ActivityThread.java:5371)
    	at java.lang.reflect.Method.invokeNative(Native Method)
    	at java.lang.reflect.Method.invoke(Method.java:525)
    	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    	at dalvik.system.NativeStart.main(Native Method)

         在网上很多关于该bug的处理都众说纷纭,我在这里不再详述该bug产生的原因,下面给出一种在4.1的机子上测试通过的方案:

    1.让你的view(可能是ScrollView,WebView,MapView等),创建一个子view继承于它们中的某一个;

    2.重写onInterceptTouchEvent 和onTouchEvent方法

    3.try catch 该两个方法,形如下面:

    try{  

        super.onInterceptTouchEvent(MotionEvent ev)  

    } catch(ILLegalArgumentException ex) {  

    }  

        return false;  

      

    try{  

        super.onTouchEvent(MotionEvent ev)  

    } catch(ILLegalArgumentException ex) {  

    }  

        return false;  

    ========= 3 

    在ViewPager里缩放图片过小出的异常,自己看了网上的方法:

    1.让你的view(可能是ScrollView,WebView,MapView等),创建一个子view继承于它们中的某一个;

    2.重写onInterceptTouchEvent 和onTouchEvent方法

    3.try catch 该两个方法,形如下面:

    try{

        super.onInterceptTouchEvent(MotionEvent ev)

    } catch(ILLegalArgumentException ex) {

    }

    return false;

     

    try{

     super.onTouchEvent(MotionEvent ev)

    } catch(ILLegalArgumentException ex) {

    }

    return false;

    Tips:但是有点问题,如果是用ViewPager的话,onInterceptTouchEvent 返回false会导致ViewPager翻页出现BUG

    1. import android.content.Context;  
    2. import android.support.v4.view.ViewPager;  
    3. import android.util.AttributeSet;  
    4. import android.view.MotionEvent;  
    5. /** 
    6.  * ViewPager类,(此类只是为了防止双指缩放过小而出异常) 
    7.  * @author  
    8.  * 
    9.  */  
    10. public class ImageViewPager extends ViewPager {  
    11.   
    12.     public ImageViewPager(Context context) {  
    13.         super(context);  
    14.     }  
    15.       
    16.     public ImageViewPager(Context context, AttributeSet attrs) {  
    17.         super(context, attrs);  
    18.     }  
    19.   
    20.     @Override        
    21.     public boolean onInterceptTouchEvent(MotionEvent arg0) {  
    22.         boolean b = false;  
    23.         try {  
    24.             b = super.onInterceptTouchEvent(arg0);  
    25.         } catch (Exception e) {  
    26.               
    27.         }  
    28.         return b; //网上看的方法是直接返回false,但是会导致ViewPager翻页有BUG  
    29.     }  
    30.       
    31.     @Override  
    32.     public boolean onTouchEvent(MotionEvent arg0) {  
    33.         try {  
    34.             super.onTouchEvent(arg0);  
    35.         } catch (Exception e) {  
    36.               
    37.         }  
    38.         return false;  
    39.     }  
    40.   
    41. }  
    [html] view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"   
    5.     >  
    6.     <!-- ViewPager用自己定义的 -->  
    7.     <com.ghl.components.ImageViewPager  
    8.         android:id="@+id/show_image_viewpager"  
    9.         android:layout_width="match_parent"  
    10.         android:layout_height="match_parent"  
    11.         android:background="#4000"  
    12.         />  
    13.           
    14.     <include layout="@layout/image_selector_titlebar"/>  
    15.     <include layout="@layout/image_selector_bottom"/>  
    16.   
    17. </RelativeLayout>  

    我是这样处理ViewPager翻页就没问题了。

    ======= 2 

    转载请注明:http://blog.csdn.net/aaawqqq

    Android   java.lang.IllegalArgumentException: pointerIndex out of range  

    bug: 

     
    1. 11-27 00:12:55.029: E/AndroidRuntime(22447): java.lang.IllegalArgumentException: pointerIndex out of range  
    2. 11-27 00:12:55.029: E/AndroidRuntime(22447):      at android.view.MotionEvent.nativeGetAxisValue(Native Method)  

    原因

    绘图的时候 多点触控 放大缩小 导致一场 , 我在viewpager 里面  通过手势绘制图片 放大缩小 造成了这个bug

    我的 viewpager 解决方案: 

    1 继承 view  

    2 重写 dispatchTouchEvent

    3 抓住异常

     
    1. public class FixedViewPager extends ViewPager {  
    2.         public FixedViewPager(Context context) {  
    3.                super(context);  
    4.        }  
    5.   
    6.         public FixedViewPager(Context context, AttributeSet attrs) {  
    7.                super(context, attrs);  
    8.        }  
    9.   
    10.         @Override  
    11.         public boolean dispatchTouchEvent(MotionEvent ev) {  
    12.                try {  
    13.                       return super .dispatchTouchEvent(ev);  
    14.               } catch (IllegalArgumentException ignored) {  
    15.               } catch (ArrayIndexOutOfBoundsException e) {  
    16.               }  
    17.   
    18.                return false ;  
    19.   
    20.        }  
    21. }  

    网上有其它方法 如:

    重写onInterceptTouchEvent 和onTouchEvent方法

    try catch 该两个方法,形如下面:

     
    1. try{  
    2. super.onInterceptTouchEvent(MotionEvent ev)  
    3. catch(ILLegalArgumentException ex) {  
    4. }  
    5. return false;  
    6. try{  
    7. super.onTouchEvent(MotionEvent ev)  
    8. catch(ILLegalArgumentException ex) {  
    9. }  
    10. return false;  

    参考: http://nanjingjiangbiao-t.iteye.com/blog/1794478

     

    ============= 1 

    在做多点触控放大缩小,操作自己所绘制的图形时发生这个异常, 如果是操作图片的放大缩小多点触控不会出现这个错误

    这个bug是Android系统原因   所以第一种方式是:

    修改frameworksasecorejniandroid_view_MotionEvent.cpp的 android_view_MotionEvent_nativeGetAxisValue方法

    注释掉
     
    1. if (!validatePointerIndex(env, pointerIndex, pointerCount))   
    2. {return 0;}  
        改完后需重新编译整个系统,然后替换lib库,重新编译整个系统一般需要半个多小时,这个方法就比较麻烦了
     
    第二种方法是:捕获IllegalArgumentException(非法参数异常)异常 即如
    1. private float spacing(MotionEvent event) {  
    2.         try {  
    3.         x = event.getX(0) - event.getX(1);  
    4.         y = event.getY(0) - event.getY(1);  
    5.     } catch (IllegalArgumentException e) {  
    6.         // TODO Auto-generated catch block  
    7.         e.printStackTrace();  
    8.     }  
        第二种方法简单有效
  • 相关阅读:
    PHP $_SERVER变量
    Buddy system伙伴分配器实现
    Linux iconv使用
    内存管理(memory allocation内存分配)
    内存碎片
    《STL源码剖析》chapter2空间配置器allocator
    Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
    c++ explicit
    《STL源码剖析》环境配置
    C++ STL的各种实现版本
  • 原文地址:https://www.cnblogs.com/awkflf11/p/5363665.html
Copyright © 2011-2022 走看看