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();
});
如果有其他解决方案,欢迎大家留言。