【Android】webview强制Crash后再自恢复设计

动图更精彩

模拟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

http://www.smartapi.site/

是的,兄弟们,我还是建立了自己的官网!需要下载的大佬直接去官网下载就可以了蛤,顺便看看官网介绍

看下面的简单的


旧版本已停止维护