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.     }  
        第二种方法简单有效
  • 相关阅读:
    公用表表达式(CTE)的递归调用
    c# 如何让tooltip显示文字换行
    实战 SQL Server 2008 数据库误删除数据的恢复
    SQL SERVER数据库中 是否可以对视图进行修改删除
    asp.net中实现文件批量上传
    sql server 2008学习2 文件和文件组
    sql server 2008学习3 表组织和索引组织
    sql server 2008学习4 设计索引的建议
    sql server 2008学习10 存储过程
    .net 调用 sql server 自定义函数,并输出返回值
  • 原文地址:https://www.cnblogs.com/awkflf11/p/5363665.html
Copyright © 2011-2022 走看看