原文地址为:
Android中webview监控页面卡死
二、编写CrashMonitor.java,用来判断页面心跳:
三、webview调用监听程序:
四、页面通过js定时发送心跳:
转载请注明本文地址: Android中webview监控页面卡死
由于webview在加载页面过程中或者加载完成后,页面可能会出现卡顿或崩溃的情况,此时程序后台是感知不到的,需要通过程序手段监测出来。
因此采取页面上定时发送心跳到webview后端,后端通过监测心跳来判断页面有没有死掉的情况。
一、先编写java相关文件HeartJavaScriptFunction.java,用于向js提供调用的接口函数:
public interface HeartJavaScriptFunction {
void onJsFunctionCalled(int tag);
}
二、编写CrashMonitor.java,用来判断页面心跳:
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class CrashMonitor {
private ScheduledExecutorService executorService = null;
private long oldpos = 0;
private int pauseNum = 0;
private OnCrashedListener onCrashedListener;
public interface OnCrashedListener {
void onCrashed();
}
public void setOnCrashedListener(OnCrashedListener listener) {
onCrashedListener = listener;
}
public boolean isWorking(){
boolean res = false;
if(executorService != null){
res = true;
}
return res;
}
public void updateTimer(long pos){
oldpos = pos;
}
public void monitorPageCrashed(final int period){
executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
if(oldpos > 0 && (new Date().getTime() - oldpos) > 1 * 60 * 1000){
pauseNum ++;
}
if(pauseNum >= 3){
oldpos = 0;
executorService.shutdown();
//do something
if(onCrashedListener != null){
onCrashedListener.onCrashed();
}
return;
}
}
},0,period, TimeUnit.MILLISECONDS);
}
}
三、webview调用监听程序:
mWebView.addJavascriptInterface(new HeartJavaScriptFunction() {
@Override
public void onJsFunctionCalled(int tag) {
// TODO Auto-generated method stub
if(crashMonitor != null){
crashMonitor.updateTimer(new Date().getTime());
if(!crashMonitor.isWorking()){
crashMonitor.monitorPageCrashed(tag);
}
}
}
}, "Android");
crashMonitor.setOnCrashedListener(new CrashMonitor.OnCrashedListener() {
@Override
public void onCrashed() {
// TODO Auto-generated method stub
//页面卡死了
}
});
四、页面通过js定时发送心跳:
<script type="text/javascript">
var intv = 10 * 1000;
setInterval(function () {
if(typeof Android != "undefined"){
Android.onJsFunctionCalled(intv);
}
}, intv);
</script>
转载请注明本文地址: Android中webview监控页面卡死