当前位置: 首页 > news >正文

【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/

是的,兄弟们,我还是建立了自己的官网!需要下载的大佬直接去官网下载就可以了蛤,顺便看看官网介绍
看下面的简单的
在这里插入图片描述


旧版本已停止维护

http://www.dtcms.com/a/351492.html

相关文章:

  • 服务器初始化
  • 影响服务器托管费用的因素​
  • ROS2 Helloworld 入门——包含完整pdf手册
  • Linux驱动开发笔记(九)——内核定时器
  • CSS 优先级:公司组织架构模型
  • css3背景线性渐变:linear-gradient
  • 基于Python+MySQL实现物联网引论课程一个火警报警及应急处理系统
  • 面向 6G 网络的 LLM 赋能物联网:架构、挑战与解决方案
  • 相机激光安全等级和人眼安全
  • 第九届MathorCup高校数学建模挑战赛-D题:钢水“脱氧合金化”配料方案的优化
  • 五自由度磁悬浮轴承同频振动抑制:从机理拆解到传递函数验证的核心方案
  • 【图像算法 - 24】基于深度学习与 OpenCV 实现人员跌倒识别系统(目标检测方案 - 跌倒即目标)
  • Baumer高防护相机如何通过YoloV8深度学习模型实现形状检测器的使用(YOLOv8 Shape Detector)
  • 无人机航拍数据集|第32期 无人机采矿区作业目标检测YOLO数据集202张yolov11/yolov8/yolov5可训练
  • GaussDB 数据库架构师修炼(十八) SQL引擎-计划管理-SPM
  • Windows MCP 安装教程:让 AI 代理与 Windows 系统无缝交互
  • plantsimulation知识点 RGV小车前端与后端区别
  • 数字营销岗位需要具备的能力有哪些
  • 洛谷 P12332 题解
  • 图论入门与邻接表详解
  • 代码随想录Day62:图论(Floyd 算法精讲、A * 算法精讲、最短路算法总结、图论总结)
  • ElementUI之菜单(Menu)使用
  • 美团购物车小球动画效果
  • Docker Compose 使用指南 - 1Panel 版
  • 国产化芯片ZCC3790--同步升降压控制器的全新选择, 替代LT3790
  • 第17章|PowerShell 安全警报——高分学习笔记(运维实战向)
  • Tableau Server高危漏洞允许攻击者上传任意恶意文件
  • 数据库云平台:提升运维效率与降低成本的有效工具
  • 【Ubuntu系统实战】一站式部署与管理MySQL、MongoDB、Redis三大数据库
  • WPS 智能文档,5分钟上手!