java.lang.AssertionError Androi

作者: alphet | 来源:发表于2018-07-11 09:52 被阅读10次

    4月份开始,就收集到有用户在webview里面的闪退日志,一直没能重现。
    java.lang.AssertionError

    第一种异常

    java.lang.AssertionError
    
    org.chromium.content.browser.input.ImeUtils.checkCondition(ImeUtils.java:1)
    2 org.chromium.content.browser.input.ThreadedInputConnection.assertOnImeThread(ThreadedInputConnection.java:64)
    3 org.chromium.content.browser.input.ThreadedInputConnection.beginBatchEdit(ThreadedInputConnection.java:132)
    4 com.xxxx.xxx.xx.WMEditor$i.beginBatchEdit(RichEditor.java:665)
    5 com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:473)
    6 com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
    7 android.os.Handler.dispatchMessage(Handler.java:105)
    8 android.os.Looper.loop(Looper.java:164)
    9 android.app.ActivityThread.main(ActivityThread.java:6938)
    10 java.lang.reflect.Method.invoke(Native Method)
    11 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    12 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
    

    第二种异常

    java.lang.AssertionError
    
    
    org.chromium.content.browser.input.ImeUtils.checkCondition(ImeUtils.java:1)
    2 org.chromium.content.browser.input.ThreadedInputConnection.assertOnImeThread(ThreadedInputConnection.java:64)
    3 org.chromium.content.browser.input.ThreadedInputConnection.endBatchEdit(ThreadedInputConnection.java:136)
    4  com.xxxx.xxx.xx.WMEditor$MInputConnection.endBatchEdit(RichEditor.java:787)
    5 com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:482)
    6 com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
    7 android.os.Handler.dispatchMessage(Handler.java:105)
    8 android.os.Looper.loop(Looper.java:164)
    9 android.app.ActivityThread.main(ActivityThread.java:6940)
    10 java.lang.reflect.Method.invoke(Native Method)
    11 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    12 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
    

    第三种异常

    java.lang.AssertionError
    
    org.chromium.content.browser.input.ImeUtils.checkCondition(ImeUtils.java:1)
    2 org.chromium.content.browser.input.ThreadedInputConnection.assertOnImeThread(ThreadedInputConnection.java:64)
    3 org.chromium.content.browser.input.ThreadedInputConnection.getExtractedText(ThreadedInputConnection.java:105)
    4 com.xxxx.xxx.xx.WMEditor$MInputConnection.getExtractedText(RichEditor.java:823)
    5 com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:326)
    6 com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
    7 android.os.Handler.dispatchMessage(Handler.java:105)
    8 android.os.Looper.loop(Looper.java:164)
    9 android.app.ActivityThread.main(ActivityThread.java:6940)
    10 java.lang.reflect.Method.invoke(Native Method)
    11 com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    12 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
    

    上周末,升级了最新的系统补丁,发现进入webview,直接闪退了,错误就是AssertionError。

    先描述下这个问题板块的功能:使用webview,结合javascript、html,让webview里面的主div,可编辑。

    因为手机品牌、android系统的兼容问题,在自定义webview里面,重写了部分键盘事件,就是这部分重写的代码造成了java.lang.AssertionError。

    下面贴下 ,出错的代码

    import android.content.Context;
    import android.view.inputmethod.EditorInfo;
    import android.view.inputmethod.InputConnection;
    import android.webkit.WebView;
    
    
    public class MEditor  extends WebView{
        public MEditor(Context context) {
            super(context);
        }
    
    
        @Override
        public InputConnection onCreateInputConnection(EditorInfo outAttrs) {
            return new MInputContection(super.onCreateInputConnection(outAttrs));
        }
    
        .
        .
        .
        .
        .
        .
    
    }
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.view.KeyEvent;
    import android.view.inputmethod.CompletionInfo;
    import android.view.inputmethod.CorrectionInfo;
    import android.view.inputmethod.ExtractedText;
    import android.view.inputmethod.ExtractedTextRequest;
    import android.view.inputmethod.InputConnection;
    import android.view.inputmethod.InputContentInfo;
    
    public class MInputContection extends InputConnection{
        private MInputContection MiC=null;
    
        public MInputContection(InputConnection in){
            this.MiC=in;
    
        }
    
        .
        .
        .
        .
        .
        .
    
    
        @Override
        public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) {
            if(MiC!=null){
                return MiC.getExtractedText(request,flags);
            }
            return null;
        }
        @Override
        public boolean beginBatchEdit() {
            if(MiC!=null){
                return MiC.beginBatchEdit();
            }
            return false;
        }
    
        @Override
        public boolean endBatchEdit() {
            if(MiC!=null){
                return MiC.endBatchEdit();
            }
            return false;
        }
    
        @Override
        public boolean sendKeyEvent(KeyEvent event) {
            doSth();
            return true;
        }
    
    
    
    }
    
    

    我的解决方案有两种:
    第一种
    针对收集到的日志,这个bug,出现在beginBatchEdit、endBatchEdit、getExtractedText这3个method里面,并且只会在7.0及以上的手机上才会产生。那么我们只需要处理这3个方法就可以了,改动代码如下:

    判断系统版本
    private Boolean isN(){
            if (Build.VERSION_CODES.N<=Build.VERSION.SDK_INT){
                return true;
            }
            return false;
        }
    

    bug方法修改

                    @Override
            public boolean beginBatchEdit() {
                if ( isN()){
                    return false;
                }else{
                    if(mConnection!=null){
                        return mConnection.beginBatchEdit();
                    }
                }
                return false;
            }
    
                    @Override
            public boolean endBatchEdit() {
                if ( isN()){
                    return false;
                }else{
                    try {
                        return mConnection.endBatchEdit();
                    } catch (Exception e) {
                    }
                }
                return false;
            }
    
                    @Override
            public ExtractedText getExtractedText(ExtractedTextRequest request, int flags) {
    
                if ( isN()){
                    return null;
                }else{
                    if(mConnection==null) {
                        return null;
                    }
                    return mConnection.getExtractedText(request,flags);
                }
            }
    
    

    第二种
    直接在javascript语言里面重写key事件,移除掉android里面的inputconnection。

    public class MEditor extends WebView {
            public MEditor(Context context)
           {
        }
            .
            .
            .
            .
            @Override
        public InputConnection onCreateInputConnection(EditorInfo outAttrs) 
           {                                   
                  return    super.onCreateInputConnection(outAttrs);
        }
            .
    }
    
    javascript 代码修改
    mEditor.addEventListener("keyup", function(e) {
        doSth();
    });
    

    如果有其他解决方案,欢迎大家留言。

    相关文章

      网友评论

        本文标题:java.lang.AssertionError Androi

        本文链接:https://www.haomeiwen.com/subject/meicpftx.html