【Android】webview强制Crash后再自恢复设计
动图更精彩
模拟WebView 崩溃Crash
官方给出的方式是:
访问:chrome://crash
或者 chrome://inducebrowsercrashforrealz
chrome://crashchrome://inducebrowsercrashforrealz
捕获webview崩溃
public class MyWebViewClient extends WebViewClient {@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);Log.e(TAG,"onReceivedError called! code=" + error.getErrorCode()+" ,desc="+error.getDescription());}@Overridepublic boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {Log.e(TAG,"onRenderProcessGone called!");recreateWebViewAndReload(view);return true;}@Nullable@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {return super.shouldInterceptRequest(view, request);}}
使用上
webView.setWebViewClient(new MyWebViewClient());
webview崩溃后会停顿一段时间触发onRenderProcessGone
;后续逻辑就可以在这里进行webview恢复了。
webView恢复方式
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());}
整体效果参考动图更精彩!
全部代码如下:
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/";@Overrideprotected 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 {@Overridepublic void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {super.onReceivedError(view, request, error);Log.e(TAG,"onReceivedError called! code=" + error.getErrorCode()+" ,desc="+error.getDescription());}@Overridepublic boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) {Log.e(TAG,"onRenderProcessGone called!");recreateWebViewAndReload(view);return true;}@Nullable@Overridepublic 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/
是的,兄弟们,我还是建立了自己的官网!需要下载的大佬直接去官网下载就可以了蛤,顺便看看官网介绍
看下面的简单的