Android WebView 与 JS 交互

目录

  • 二、具体分析
    • 2.1 Android通过WebView调用 JS 代码
      • 方式1:通过WebView的loadUrl()
      • 方式2:通过WebView的evaluateJavascript()
      • 方法对比
      • 使用建议
    • 2.2、JS通过WebView调用 Android 代码
      • 2.2.1、方法分析
        • 方式1:通过 WebView的addJavascriptInterface()进行对象映射
        • 方式2:通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url
        • 方式3:通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息
        • 三种方式的对比 & 使用场景


相关文章阅读:

  • Android WebView使用攻略



Github下载地址Android WebView与JS互调


# 一、交互方式总结 Android与JS通过WebView互相调用方法,实际上是:
  • Android去调用JS的代码;

  • JS去调用Android的代码;

二者沟通的桥梁是WebView

对于Android调用JS代码的方法有2种:

  • 通过WebView的loadUrl()

  • 通过WebView的evaluateJavascript()

对于JS调用Android代码的方法有3种:

  • 通过 WebViewaddJavascriptInterface()进行对象映射;

  • 通过 WebViewClientshouldOverrideUrlLoading() 方法回调拦截 url;

  • 通过 WebChromeClientonJsAlert()onJsConfirm()onJsPrompt()方法回调拦截 JS 对话框alert()confirm()prompt()消息;

二、具体分析

2.1 Android通过WebView调用 JS 代码

对于Android调用JS代码的方法有2种:

  • 通过WebView的loadUrl()

  • 通过WebView的evaluateJavascript()

方式1:通过WebView的loadUrl()

  • 实例介绍:点击Android按钮,即调用WebView JS(文本名为javascript)中callJS()

  • 具体使用:

步骤1:将需要调用的JS代码以.html格式放到src/main/assets文件夹里

1、为了方便展示,本文是采用Andorid调用本地JS代码说明;
2、实际情况时,Android更多的是调用远程JS代码,即将加载的JS代码路径改成url即可

需要加载JS代码:androidcalljs.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java调用JS方法</title><!-- JS代码 --><script><!-- Android需要调用的方法 -->function callJS(){alert("Android调用了JS的callJS方法");}</script></head>
</html>

步骤2:在Android里通过WebView设置调用JS代码

Android代码:AndroidCallJS1.java

package com.davis.webviewjs.demo;import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;public class AndroidCallJS1 extends AppCompatActivity {private Button btn;private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init(){btn = (Button)findViewById(R.id.btn);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);// 设置允许JS弹窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先载入JS代码// 格式规定为:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/androidcalljs.html");btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {webview.post(new Runnable() {@Overridepublic void run() {// 注意调用的JS方法名要对应上// 调用javascript的callJS()方法webview.loadUrl("javascript:callJS()");}});}});// 由于设置了弹窗检验调用结果,所以需要支持js对话框// webview只是载体,内容的渲染需要使用webviewChromClient类去实现// 通过设置WebChromeClient对象处理JavaScript的对话框//设置响应js 的Alert()函数webview.setWebChromeClient(new WebChromeClient() {@Overridepublic boolean onJsAlert(WebView view, String url, String message, final JsResult result) {AlertDialog.Builder b = new AlertDialog.Builder(AndroidCallJS1.this);b.setTitle("Alert");b.setMessage(message);b.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {result.confirm();}});b.setCancelable(false);b.create().show();return true;}});}
}

效果图

效果图

特别注意:JS代码调用一定要在 onPageFinished() 回调之后才能调用,否则不会调用。

onPageFinished()属于WebViewClient类的方法,主要在页面加载结束时调用

方式2:通过WebView的evaluateJavascript()

  • 优点:该方法比第一种方法效率更高、使用更简洁

1、因为该方法的执行不会使页面刷新,而第一种方法(loadUrl )的执行则会。
2、Android 4.4 后才可使用

  • 具体使用
// 只需要将第一种方法的loadUrl()换成下面该方法即可
webview.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {//此处为 js 返回的结果Log.i("WEBVIEW_JS", "value : " + value);}
});

方法对比

调用方式优点缺点使用场景
使用loadUrl()方便简洁效率低;
获取返回值麻烦;
不需要获取返回值,对性能要求较低时
使用evaluateJavascript()效率高向下兼容性差(仅Android 4.4以上可用)Android 4.4以上

使用建议

两种方法混合使用,即Android 4.4以下使用方法1,Android 4.4以上方法2

// Android版本变量
final int version = Build.VERSION.SDK_INT;
// 因为该方法在 Android 4.4 版本才可使用,所以使用时需进行版本判断
if (version < 18) {webview.loadUrl("javascript:callJS()");
} else {webview.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {@Overridepublic void onReceiveValue(String value) {//此处为 js 返回的结果}});
}

2.2、JS通过WebView调用 Android 代码

对于JS调用Android代码的方法有3种:

  • 通过 WebViewaddJavascriptInterface() 进行对象映射

  • 通过 WebViewClientshouldOverrideUrlLoading() 方法回调拦截 url

  • 通过 WebChromeClientonJsAlert()onJsConfirm()onJsPrompt()方法回调拦截JS对话框alert()confirm()prompt()消息

2.2.1、方法分析

方式1:通过 WebView的addJavascriptInterface()进行对象映射

步骤1:定义一个与JS对象映射关系的Android类:AndroidtoJs

AndroidtoJs.java(注释已经非常清楚)

// 继承自Object类
public class AndroidtoJs extends Object {// 定义JS需要调用的方法// 被JS调用的方法必须加入@JavascriptInterface注解@JavascriptInterfacepublic void hello(String msg) {System.out.println("JS调用了Android的hello方法");}
}

步骤2:将需要调用的JS代码以.html格式放到src/main/assets文件夹里

需要加载JS代码:jscallandroid.html

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>JS调用Java方法</title><script>function callAndroid(){<!-- 由于对象映射,所以调用test对象等于调用Android映射的对象 -->test.hello("js调用了android中的hello方法");}</script></head><body><!-- 点击按钮则调用callAndroid函数 --><button type="button" id="button1" onclick="callAndroid()"></button></body>
</html>

步骤3:在Android里通过WebView设置Android类与JS代码的映射

package com.davis.webviewjs.demo;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;public class JSCallAndroid1 extends AppCompatActivity {private Button btn;private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init() {btn = (Button)findViewById(R.id.btn);btn.setVisibility(View.GONE);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);// 设置允许JS弹窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 通过addJavascriptInterface()将Java对象映射到JS对象//参数1:Javascript对象名//参数2:Java对象名webview.addJavascriptInterface(new AndroidtoJs(), "test");//AndroidtoJS类对象映射到js的test对象// 先载入JS代码// 格式规定为:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/jscallandroid.html");}
}

在这里插入图片描述
在这里插入图片描述
特点

  • 优点:使用简单

仅将Android对象和JS对象映射即可

  • 缺点:存在严重的漏洞问题

方式2:通过 WebViewClient 的方法shouldOverrideUrlLoading ()回调拦截 url

具体原理:

  • Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url

  • 解析该 url 的协议

  • 如果检测到是预先约定好的协议,就调用相应方法

即JS需要调用Android的方法

具体使用:

步骤1:在JS约定所需要的Url协议

JS代码:jscallandroid2.html

以.html格式放到src/main/assets文件夹里

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java调用JS方法</title><!-- JS代码 --><script>function callAndroid(){<!-- 约定的url协议为:js://webview?arg1=111&arg2=222 -->document.location = "js://webview?arg1=111&arg2=222";}</script></head><body><!-- 点击按钮则调用callAndroid函数 --><button type="button" id="button1" onclick="callAndroid()">JS调用Android方法</button></body></html>

当该JS通过Android的webview.loadUrl("file:///android_asset/jscallandroid2.html")加载后,就会回调shouldOverrideUrlLoading(),接下来继续看步骤2:

步骤2:在Android通过WebViewClient复写shouldOverrideUrlLoading()

JSCallAndroid2.java

package com.davis.webviewjs.demo;import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;import java.util.HashMap;
import java.util.Set;public class JSCallAndroid2 extends AppCompatActivity {private Button btn;private WebView webview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init() {btn = (Button)findViewById(R.id.btn);btn.setVisibility(View.GONE);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);// 设置允许JS弹窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先载入JS代码// 格式规定为:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/jscallandroid2.html");webview.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// 步骤2:根据协议的参数,判断是否是所需要的url// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)//假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)Uri uri = Uri.parse(url);// 如果url的协议 = 预先约定的 js 协议// 就解析往下解析参数if ( uri.getScheme().equals("js")) {// 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议// 所以拦截url,下面JS开始调用Android需要的方法if (uri.getAuthority().equals("webview")) {//  步骤3:// 执行JS所需要调用的逻辑Log.i("WEBVIEW_JS","js调用了Android的方法");// 可以在协议上带有参数并传递到Android上HashMap<String, String> params = new HashMap<>();Set<String> collection = uri.getQueryParameterNames();Log.i("WEBVIEW_JS", "URI : " + uri);}return true;}return super.shouldOverrideUrlLoading(view, url);}});}
}

特点

  • 优点:不存在方式1的漏洞;

  • 缺点:JS获取Android方法的返回值复杂。

如果JS想要得到Android方法的返回值,只能通过 WebView 的 loadUrl ()去执行 JS 方法把返回值传递回去,相关的代码如下:

// Android:MainActivity.java
webview.loadUrl("javascript:returnResult(" + result + ")");// JS:javascript.html
function returnResult(result){alert("result is" + result);
}

方式3:通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

在JS中,有三个常用的对话框方法:

方法作用返回值备注
alert()弹出警告框没有在文本加入\n可换行
confirm()弹出确认框两个返回值- 返回布尔值;
- 通过该值可判断点击时确认还是取消:true表示确认,false表示取消。
prompt()弹出输入框任意设置返回值- 点击【确认】,返回输入框的的值;
- 点击【取消】,返回null。

方式3的原理:Android通过 WebChromeClientonJsAlert()onJsConfirm()onJsPrompt() 方法回调分别拦截JS对话框
(即上述三个方法),得到他们的消息内容,然后解析即可。

下面的例子将用 拦截JS的输入框(即prompt()方法) 说明 :

1、常用的拦截是:拦截 JS的输入框(即prompt()方法)
2、因为只有prompt()可以返回任意类型的值,操作最全面方便、更加灵活;而alert()对话框没有返回值;confirm()对话框只能返回两种状态(确定 / 取消)两个值;

步骤1:加载JS代码,如下:

jscallandroid3.html

以.html格式放到src/main/assets文件夹里

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Java调用JS方法</title><!-- JS代码 --><script><!-- Android需要调用的方法 -->function callJS(){var result = prompt("js://webview?arg1=111&arg2=222");alert("result : " + result);}</script></head><body><!-- 点击按钮则调用callAndroid函数 --><button type="button" id="button1" onclick="callJS()">JS调用Android方法</button></body></html>

当使用webview.loadUrl("file:///android_asset/jscallandroid3.html")加载了上述JS代码后,就会触发回调onJsPrompt(),具体如下:

1、如果是拦截警告框(即alert()),则触发回调onJsAlert();
2、如果是拦截确认框(即confirm()),则触发回调onJsConfirm();

步骤2:在Android通过WebChromeClient复写onJsPrompt()

package com.davis.webviewjs.demo;import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.LinearLayout;public class JSCallAndroid3 extends AppCompatActivity {private Button btn;private WebView webview;private LinearLayout layout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_webview);init();}private void init() {btn = (Button)findViewById(R.id.btn);btn.setVisibility(View.GONE);webview = (WebView)findViewById(R.id.webview);WebSettings webSettings = webview.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);// 设置允许JS弹窗webSettings.setJavaScriptCanOpenWindowsAutomatically(true);// 先载入JS代码// 格式规定为:file:///android_asset/文件名.htmlwebview.loadUrl("file:///android_asset/jscallandroid3.html");webview.setWebChromeClient(new WebChromeClient(){@Overridepublic boolean onJsAlert(WebView view, String url, String message, JsResult result) {// 根据协议的参数,判断是否是所需要的url(原理同方式2)// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)//假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)Log.i("WEBVIEW_JS", "message : " + message);Uri uri = Uri.parse(message);// 如果url的协议 = 预先约定的 js 协议// 就解析往下解析参数if ( uri.getScheme().equals("js")) {// 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议// 所以拦截url,下面JS开始调用Android需要的方法if (uri.getAuthority().equals("webview")) {//Log.i("WEBVIEW_JS", "js调用了Android的方法");// 拦截alert()之后必须调用result.confirm()方法,否则会出现白屏result.confirm();return true;}}return super.onJsAlert(view, url, message, result);}@Overridepublic boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {// 根据协议的参数,判断是否是所需要的url(原理同方式2)// 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)//假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)Log.i("WEBVIEW_JS", "message : " + message);Uri uri = Uri.parse(message);// 如果url的协议 = 预先约定的 js 协议// 就解析往下解析参数if ( uri.getScheme().equals("js")) {// 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议// 所以拦截url,下面JS开始调用Android需要的方法if (uri.getAuthority().equals("webview")) {//Log.i("WEBVIEW_JS", "js调用了Android的方法");// 拦截alert()之后必须调用result.confirm()方法,否则会出现白屏result.confirm("js调用了Android的方法");return true;}}return super.onJsPrompt(view, url, message, defaultValue, result);}@Overridepublic boolean onJsConfirm(WebView view, String url, String message, JsResult result) {return super.onJsConfirm(view, url, message, result);}});}@Overrideprotected void onDestroy() {if (webview != null) {webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);webview.clearHistory();((ViewGroup) webview.getParent()).removeView(webview);webview.destroy();webview = null;}super.onDestroy();}
}

三种方式的对比 & 使用场景

调用方式优点缺点使用场景
通过addJavascriptInterface()进行添加对象映射方便简洁Android 4.2以下存在漏洞问题Android 4.2以上相对简单的互调场景
通过WebVeiw的方法shouldOverrideUrlLoading()回调拦截url不存在漏洞问题- 使用复杂:需要进行协议的约束;
- 从Native层往Web层传递值比较繁琐
不需要返回值情况下的互调场景
通过WebChromeClient的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框消息不存在漏洞问题使用复杂:需要进行协议的约束;能满足大多数情况下的互调场景

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446794.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓实现登录与注册界面

使用Intent与Bundle传递数据 登录界面login.xml 1.使用Relativelayout相对布局 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"mat…

安卓Activity与intent跳转

Activity生命周期 Activity启动模式 Intent跳转 _________startActivity() 1.Intent intentnew Intent(A.this,B.class); startActivity(intent); 2.startActivity(new Intent(A.this,B.class)); _________startActivityForResult() Intent intentnew Intent(A.this,B.class…

Android WebView 使用漏洞

目录一、类型二、具体分析2.1、WebView任意代码执行漏洞2.1.1、addJavascriptInterface 接口引起远程代码执行漏洞漏洞产生原因解决方案关于该方法的其他细节总结2.1.2、searchBoxJavaBridge_接口引起远程代码执行漏洞漏洞产生原因解决方案2.1.3、accessibility和 accessibilit…

Android Studio 查看页面布局层次结构

Android Studio有个可以查看手机上app页面布局层次结构的工具。可以协助我们对布局进行优化&#xff0c;去掉没有必要的节点等&#xff0c;通过这个工具可以清晰的看见页面整个结构&#xff1b;废话少说直接上图&#xff0c;再说过程。 这就是我们想要看到的&#xff0c;每个节…

Java web后端 第一章框架搭建

Redis 通用Mapper 通用Mapper->MyBatis动态SQL封装包,增删改查 0 SQL语句 PageHelper PageHelper–>实现分页操作,不需要limit,直接使用静态方法 电商系统技术特点 分布式(数据很多,一台电脑存储一部分数据) 高并发,集群(并发量很高,后台不只一个电脑) ,海量数据 主…

android--地图定位打卡

获取位置信息 1)位置信息 GPS卫星定位,在室外适用 基站(3个基站交叉,锁定手机位置)–基站定位不平均,有些地方实现不了3点定位 网络定位–通过手机IP地址,去锁定位置(消耗流量,对网络有要求) 谷歌地图的大致实现思路(通用) 2)实现定位功能的重要类 在百度地图和高德地图中不…

android--在命令行中生成Android的数字证书keystore文件

标题 生成 密钥口令为 13458977480 密钥库口令为 13458977480 存放位置 查看证书的相关资料

IDEA 创建 SpringBoot 项目

目录一、新建Springboot项目第一步&#xff1a;新建一个Springboot项目第二步&#xff1a;选择项目模板第三步&#xff1a;设置项目配置第四步&#xff1a;设置项目依赖第五步&#xff1a;设置项目名称及路径第六步&#xff1a;创建完成二、测试及运行1、测试代码2、设置默认端…

VC++软件

一个main fatal error LNK1169: 找到一个或多个多重定义的符号–报错 一个项目即一个程序&#xff0c;多个文件只能有一个main函数 删除掉多余的main 控制台按enter键闪退 在代码中加上 #include<stdlib.h> getchar();//让控制台停留 system("pause");//让…

IDEA 将 SpringBoot 项目打包成jar

目录一、打包配置1、File -> Project Structure2、Project Structure3、设置启动类及META-INF4、设置打包输出目录二、打包1、Build -> Artifacts2、Build三、查看打包文件四、运行新建SpringBoot项目&#xff1a;IDEA 创建 SpringBoot 项目 一、打包配置 1、File -> …

如何查看软连接,以及相关注意事项

使用命令 ls -il 图片显示 参考链接 Linux 命令之软连接详解Linux软连接 查看/创建/删除

Git SSH key配置

一、检查本地Git配置 用如下命令&#xff08;如未特别说明&#xff0c;所有命令均默认在Git Bash工具下执行&#xff09;检查一下用户名和邮箱是否配置&#xff08;github支持我们用用户名或邮箱登录&#xff09;&#xff1a; git config --global --list 显示信息如下&#…

HTTPS 工作原理

一、简介 HTTPS对于客户端开发人员来说并没有什么需要特别注意的地方&#xff0c;因为代码和写HTTP请求时并没有什么两样。但也正是因为这个原因&#xff0c;导致许多客户端开发人员对HTTPS并不了解&#xff0c;只知道它是安全的加密网络传输&#xff0c;对其具体的工作原理却一…

解决VM虚拟机中ubuntu系统上不了网的问题

最简单的方式 关闭虚拟机在对应的虚拟机上右键&#xff0c;点击设置&#xff0c;找到网络适配器&#xff0c;点击移除&#xff0c;再次点击添加&#xff0c;将网络适配器再次添加回来&#xff0c;点击确定重启虚拟机如果第一种方式解决不了问题&#xff0c;请使用第二种方式 …

Android Glide图片加载框架(一)基本用法

文章目录一、前言二、简介三、基本用法第一步&#xff1a;调用 Glide.with() 方法创建加载图片的实例第二步&#xff1a;调用 load() 方法指定待加载的图片资源第三步&#xff1a;调用 into() 方法绑定显示控件总结四、扩展用法1、占位图2、指定图片格式3、指定图片大小Android…

操作系统 进程 学习以及思考

进程管理逻辑图 将多个程序拷贝到进程中&#xff0c;占用内存&#xff0c;如图扇形区域&#xff0c;当酷狗进程需要资源的时候&#xff0c;会通过I/O子系统取用资源的过程中&#xff0c;会放弃对cpu的占用&#xff0c;cpu就会处理别的进程&#xff0c;因此提高了cpu的利用率&am…

Android Glide图片加载框架(二)源码解析之with()

文章目录一、前言二、如何阅读源码三、源码解析1、with()Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#xff09;源码解析之with() Android Glide图片加载框架&#xff08;二…

计算机操作系统生产者和消费者模型的简单介绍

同步互斥小口诀 画图理解题目判断题目类型分析进程数目 填写进程模板补充基本代码(伪代码)补充PV代码检查调整代码 注意事项 代码是一步一步写出来的&#xff0c;代码是反复调整写出来的60%是生产者和消费者模型30%是读者和写者的模型 生产者和消费者 例子1 妈妈每次放放一…

Android Glide图片加载框架(二)源码解析之load()

文章目录一、前言二、源码分析1、load()Android Glide图片加载框架系列文章 Android Glide图片加载框架&#xff08;一&#xff09;基本用法 Android Glide图片加载框架&#xff08;二&#xff09;源码解析之with() Android Glide图片加载框架&#xff08;二&#xff09;源码…

计算机操作系统读者和写者模型的简单介绍以及思考

读者和写者 读写两组进程&#xff0c;共享一个文件&#xff0c;多个读者可以同时访问文件&#xff0c;多个写者不可以同时访问文件&#xff0c;写者和读者也不可以同时访问文件共享读&#xff1b;独占写特征:1,资源被谁占有&#xff1b;2&#xff0c;写者改变资源&#xff0c;…