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(); });
如果有其他解决方案,欢迎大家留言。
作者:Sn__
链接:https://www.jianshu.com/p/1f14be457ded
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦