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

南昌正规网站公司5g网络优化培训

南昌正规网站公司,5g网络优化培训,流感吃什么药最好,网站建设技巧Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。如何实现实现Java和js交互十分便捷。通常只需要以下几步。WebView开启JavaScript脚本执…

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。

如何实现

实现Java和js交互十分便捷。通常只需要以下几步。

WebView开启JavaScript脚本执行

WebView设置供JavaScript调用的交互接口。

客户端和网页端编写调用对方的代码。

本例代码

为了便于讲解,先贴出全部代码

Java代码

public class MainActivity extendsActivity {private static final String LOGTAG = "MainActivity";

@SuppressLint("JavascriptInterface")

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);final WebView myWebView =(WebView) findViewById(R.id.myWebView);

WebSettings settings=myWebView.getSettings();

settings.setJavaScriptEnabled(true);

myWebView.addJavascriptInterface(new JsInteration(), "control");

myWebView.setWebChromeClient(newWebChromeClient() {});

myWebView.setWebViewClient(newWebViewClient() {

@Overridepublic voidonPageFinished(WebView view, String url) {super.onPageFinished(view, url);

testMethod(myWebView);

}

});

myWebView.loadUrl("file:///android_asset/js_java_interaction.html");

}private voidtestMethod(WebView webView) {

String call= "javascript:sayHello()";

call= "javascript:alertMessage(\"" + "content" + "\")";

call= "javascript:toastMessage(\"" + "content" + "\")";

call= "javascript:sumToJava(1,2)";

webView.loadUrl(call);

}public classJsInteration {

@JavascriptInterfacepublic voidtoastMessage(String message) {

Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG).show();

}

@JavascriptInterfacepublic void onSumResult(intresult) {

Log.i(LOGTAG,"onSumResult result=" +result);

}

}

}

前端网页代码

1

2

3 functionsayHello() {4 alert("Hello")5 }6

7 functionalertMessage(message) {8 alert(message)9 }10

11 functiontoastMessage(message) {12 window.control.toastMessage(message)13 }14

15 functionsumToJava(number1, number2){16 window.control.onSumResult(number1+number2)17 }18

19 Java-Javascript Interaction In Android20

调用示例

js调用Java

调用格式为window.jsInterfaceName.methodName(parameterValues) 此例中我们使用的是control作为注入接口名称。

1 function toastMessage(message) {2 window.control.toastMessage(message)3 }4

5 function sumToJava(number1, number2){6 window.control.onSumResult(number1 +number2)7 }

Java调用JS

webView调用js的基本格式为webView.loadUrl(“javascript:methodName(parameterValues)”)

调用js无参无返回值函数

String call = "javascript:sayHello()";

webView.loadUrl(call);

调用js有参无返回值函数

注意对于字符串作为参数值需要进行转义双引号。

String call = "javascript:alertMessage(\"" + "content" + "\")";

webView.loadUrl(call);

调用js有参数有返回值的函数

Android在4.4之前并没有提供直接调用js函数并获取值的方法,所以在此之前,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

1.Java调用js代码

String call = "javascript:sumToJava(1,2)";

webView.loadUrl(call);

2.js函数处理,并将结果通过调用java方法返回

function sumToJava(number1, number2){

window.control.onSumResult(number1 + number2)

}

3.Java在回调方法中获取js函数返回值

@JavascriptInterface

public void onSumResult(int result) {

Log.i(LOGTAG, "onSumResult result=" + result);

}

4.4处理

Android 4.4之后使用evaluateJavascript即可。这里展示一个简单的交互示例 具有返回值的js方法

function getGreetings() {

return 1;

}

java代码时用evaluateJavascript方法调用

private void testEvaluateJavascript(WebView webView) {

webView.evaluateJavascript("getGreetings()", new ValueCallback() {

@Override

public void onReceiveValue(String value) {

Log.i(LOGTAG, "onReceiveValue value=" + value);

}});

}

输出结果

I/MainActivity( 1432): onReceiveValue value=1

注意

上面限定了结果返回结果为String,对于简单的类型会尝试转换成字符串返回,对于复杂的数据类型,建议以字符串形式的json返回。

evaluateJavascript方法必须在UI线程(主线程)调用,因此onReceiveValue也执行在主线程。

疑问解答

Alert无法弹出

你应该是没有设置WebChromeClient,按照以下代码设置

myWebView.setWebChromeClient(new WebChromeClient() {});

Uncaught ReferenceError: functionName is not defined

问题出现原因,网页的js代码没有加载完成,就调用了js方法。解决方法是在网页加载完成之后调用js方法

myWebView.setWebViewClient(new WebViewClient() {

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

//在这里执行你想调用的js函数

}

});

Uncaught TypeError: Object [object Object] has no method

安全限制问题

如果只在4.2版本以上的机器出问题,那么就是系统处于安全限制的问题了。Android文档这样说的

Caution: If you’ve set your targetSdkVersion to 17 or higher, you must add the @JavascriptInterface annotation to any method that you want available your web page code (the method must also be public). If you do not provide the annotation, then the method will not accessible by your web page when running on Android 4.2 or higher.

中文大意为

警告:如果你的程序目标平台是17或者是更高,你必须要在暴露给网页可调用的方法(这个方法必须是公开的)加上@JavascriptInterface注释。如果你不这样做的话,在4.2以以后的平台上,网页无法访问到你的方法。

两种解决方法

将targetSdkVersion设置成17或更高,引入@JavascriptInterface注释

自己创建一个注释接口名字为@JavascriptInterface,然后将其引入。注意这个接口不能混淆。

注,创建@JavascriptInterface代码

public @interface JavascriptInterface {

}

代码混淆问题

如果在没有混淆的版本运行正常,在混淆后的版本的代码运行错误,并提示Uncaught TypeError: Object [object Object] has no method,那就是你没有做混淆例外处理。 在混淆文件加入类似这样的代码

-keep class com.example.javajsinteractiondemo$JsInteration {

*;

}

All WebView methods must be called on the same thread

过滤日志曾发现过这个问题。

E/StrictMode( 1546): java.lang.Throwable: A WebView method was called on thread 'JavaBridge'. All WebView methods must be called on the same thread. (Expected Looper Looper (main, tid 1) {528712d4} called on Looper (JavaBridge, tid 121) {52b6678c}, FYI main Looper is Looper (main, tid 1) {528712d4})

E/StrictMode( 1546): at android.webkit.WebView.checkThread(WebView.java:2063)

E/StrictMode( 1546): at android.webkit.WebView.loadUrl(WebView.java:794)

E/StrictMode( 1546): at com.xxx.xxxx.xxxx.xxxx.xxxxxxx$JavaScriptInterface.onCanGoBackResult(xxxx.java:96)

E/StrictMode( 1546): at com.android.org.chromium.base.SystemMessageHandler.nativeDoRunLoopOnce(Native Method)

E/StrictMode( 1546): at com.android.org.chromium.base.SystemMessageHandler.handleMessage(SystemMessageHandler.java:27)

E/StrictMode( 1546): at android.os.Handler.dispatchMessage(Handler.java:102)

E/StrictMode( 1546): at android.os.Looper.loop(Looper.java:136)

E/StrictMode( 1546): at android.os.HandlerThread.run(HandlerThread.java:61)

在js调用后的Java回调线程并不是主线程。如打印日志可验证

ThreadInfo=Thread[WebViewCoreThread,5,main]

解决上述的异常,将webview操作放在主线程中即可。

webView.post(new Runnable() {

@Override

public void run() {

webView.loadUrl(YOUR_URL).

}

});

http://www.lbrq.cn/news/2496727.html

相关文章:

  • 那个网站可以做图标一个产品的宣传和推广方案
  • 高端 网站开发交换友情链接的途径有哪些
  • 企业网站建设怎么选择空间聚合搜索引擎入口
  • 腾讯云如何建设网站首页福州seo招聘
  • 可以看所有网站的浏览器网站seo策划
  • 机械手表网站百度推广一级代理商名单
  • 温州网站定制哪家好属于b2b的网站有哪些
  • 做cp和网站运营付费推广外包
  • wordpress表情外贸网站优化公司
  • 常州市网站建设深圳龙岗区布吉街道
  • 郑州建立网站百度大数据
  • 网站收录怎么提高快速排名优化系统
  • 河南便宜网站建设价格兰州seo新站优化招商
  • 网站架构图的制作网络营销到底是个啥
  • 企业网站建站元素googleplay安卓版下载
  • 厂字型布局网站例子中国搜索引擎有哪些
  • 在网站做登记表备案 如果修改优化大师破解版app
  • wdcp拒绝访问网站十大免费无代码开发软件
  • wordpress次级目录ftp廊坊seo关键词优化
  • 好看的学校网站模板免费下载关键词歌词含义
  • 徐州建站软件现在有什么推广平台
  • 网站服务器试用百度的总部在哪里
  • 怎么仿别人的网站近几天发生的新闻大事
  • 网站建设教程答允苏州久远网络产品推广宣传方案
  • 广州企业网站建设推荐网店营销策略有哪些
  • 网站建设咨询公国内新闻最新消息今天
  • 珠海市网站建设公司网站建设与优化
  • html模板网站想做电商应该怎么入门
  • 网站建设推广报价单2023年国际新闻大事件10条
  • 品牌建设网站唐山seo
  • 电商项目_核心业务_分布式ID服务
  • Java 大视界 -- Java 大数据机器学习模型在电商客户细分与精准营销活动策划中的应用(367)
  • C语言中:形参与实参的那些事
  • C++核心编程学习--对象特性--友元
  • LLM中 词嵌入向量中的正负值表示什么含义
  • CentOS 7 安装 MySQL 8.4.6(二进制包)指南