动图更精彩

模拟WebView 崩溃Crash
官方给出的方式是:
访问:chrome://crash
或者 chrome://inducebrowsercrashforrealz
bash
chrome://crash
chrome://inducebrowsercrashforrealz
捕获webview崩溃
java
public class MyWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Log.e(TAG,"onReceivedError called! code=" + error.getErrorCode()+" ,desc="+error.getDescription());
}
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
Log.e(TAG,"onRenderProcessGone called!");
recreateWebViewAndReload(view);
return true;
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
}
使用上
java
webView.setWebViewClient(new MyWebViewClient());
webview崩溃后会停顿一段时间触发onRenderProcessGone
;后续逻辑就可以在这里进行webview恢复了。
webView恢复方式
java
private void recreateWebViewAndReload(WebView view) {
if(view==null||view.getParent()==null|| !(view.getParent() instanceof ViewGroup)){
Log.i(TAG,"应用需要重启");
return;
}
ViewGroup parent= (ViewGroup) view.getParent();
int index=parent.indexOfChild(view);
ViewGroup.LayoutParams lp= view.getLayoutParams();
parent.removeView(view);
view.destroy();
WebView webViewNew=new WebView(parent.getContext());
webViewNew.setLayoutParams(lp);
parent.addView(webViewNew,index);
webViewNew.loadUrl(url);
webView=webViewNew;
webView.setWebViewClient(new MyWebViewClient());
}
整体效果参考动图更精彩!
全部代码如下:
java
package com.example.webviewdemo1;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.RenderProcessGoneDetail;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class WebViewActivity extends AppCompatActivity {
public static String TAG=WebViewActivity.class.getSimpleName();
WebView webView;
WebSettings webSettings;
String url="http://www.smartapi.site/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
webView=findViewById(R.id.webView);
webSettings = webView.getSettings();
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl(url);
}
public void loadCrashUrl(View view){
Log.d(TAG,"loadCrashUrl called!");
webView.loadUrl("chrome://crash");
}
public class MyWebViewClient extends WebViewClient {
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Log.e(TAG,"onReceivedError called! code=" + error.getErrorCode()+" ,desc="+error.getDescription());
}
@Override
public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {
Log.e(TAG,"onRenderProcessGone called!");
recreateWebViewAndReload(view);
return true;
}
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
}
private void recreateWebViewAndReload(WebView view) {
if(view==null||view.getParent()==null|| !(view.getParent() instanceof ViewGroup)){
Log.i(TAG,"应用需要重启");
return;
}
ViewGroup parent= (ViewGroup) view.getParent();
int index=parent.indexOfChild(view);
ViewGroup.LayoutParams lp= view.getLayoutParams();
parent.removeView(view);
view.destroy();
WebView webViewNew=new WebView(parent.getContext());
webViewNew.setLayoutParams(lp);
parent.addView(webViewNew,index);
webViewNew.loadUrl(url);
webView=webViewNew;
webView.setWebViewClient(new MyWebViewClient());
}
}
==========END
产品推荐
推荐理由
postman在国内使用已经越来越困难:
1、登录问题严重
2、Mock功能服务基本没法使用
3、版本更新功能已很匮乏
4、某些外力因素导致postman以后能否使用风险较大
5、postman会导致电脑卡顿,而且使用的功能越多越慢,尤其是win电脑,太让人郁闷了
出于以上考虑因此笔者自己开发了一款api调试开发工具SmartApi,满足基本日常开发调试api需求
官网地址SmartApi
是的,兄弟们,我还是建立了自己的官网!需要下载的大佬直接去官网下载就可以了蛤,顺便看看官网介绍
看下面的简单的