这几天和别人对接移动端,安卓平台,我们这边输出vue界面,安卓方反馈轮询的时候调用不到,具体原因也定位不到,只能确定前端这边没几句代码,应该没有问题,因此决定自己下载个android studio写个例子,其实以前也做过java和android开发,并不陌生。

网上很多帖子只给出了最基础的例子,我们这边的需求是android端需要轮询调用js方法,因此启动了一个定时器,下面上代码。

android代码:

  1 package com.example.testcallvue2;
2
3 import androidx.appcompat.app.AppCompatActivity;
4
5 import android.os.Bundle;
6 import android.webkit.ValueCallback;
7 import android.webkit.WebChromeClient;
8 import android.webkit.WebSettings;
9 import android.webkit.WebView;
10 import android.webkit.WebViewClient;
11
12 import java.io.IOException;
13 import java.util.Timer;
14 import java.util.TimerTask;
15 import java.util.concurrent.atomic.AtomicBoolean;
16
17 public class MainActivity extends AppCompatActivity {
18
19 @Override
20 protected void onCreate(Bundle savedInstanceState) {
21 super.onCreate(savedInstanceState);
22 setContentView(R.layout.activity_main);
23 //获得控件
24 WebView webView = (WebView) findViewById(R.id.wv_webview);
25 WebSettings webSettings = webView.getSettings();
26
27 //设置支持js
28 webSettings.setJavaScriptEnabled(true);
29 // 设置允许JS弹窗
30 webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
31 //设置适应屏幕
32 webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
33 webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
34 webSettings.setPluginState(WebSettings.PluginState.ON);//设置是否支持插件
35 webSettings.setSupportZoom(true); //支持缩放
36 webSettings.setBuiltInZoomControls(true);
37 webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
38 //设置存储模式
39 webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
40 webSettings.setAllowFileAccess(true);
41 //setDomStorageEnabled解决了webview白屏问题 设置支持DomStorage
42 webSettings.setDomStorageEnabled(true);
43 //设置支持本地存储
44 webSettings.setDatabaseEnabled(true);
45 //设置缓存
46 // webSettings.setAppCacheEnabled(true);
47 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
48 webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
49 webSettings.setDefaultTextEncodingName("utf-8");
50
51 System.out.println("WebView初始化...");
52
53 //用这个方法判断是否加载完成,不过会触发多次,就是会出现多次newProgress==100的情况
54 webView.setWebChromeClient(new WebChromeClient() {
55
56 @Override
57 public void onProgressChanged(WebView view, int newProgress) {
58 super.onProgressChanged(view, newProgress);
59 if (newProgress == 100) {
60 System.out.println("WebView加载完成...");
61 Timer timer = new Timer();
62 TimerTask task = new TimerTask() {
63 @Override
64 public void run() {
65 try {
66 webView.post(new Runnable() {
67 @Override
68 public void run() {
69 webView.evaluateJavascript("javascript:manualCtrl()", new ValueCallback<String>() {
70 @Override
71 public void onReceiveValue(String value) {
72 //此处为 js 返回的结果
73 System.out.println(value);
74 }
75 });
76 }
77 });
78 } catch (Exception e) {
79 throw new RuntimeException(e);
80 }
81 }
82 };
83 timer.schedule(task,10 * 1000,5 * 1000);
84 }
85 }
86 });
87
88 //访问网页
89 // webView.loadUrl("http://www.baidu.com");
90 webView.loadUrl( "file:///android_asset/index2.html");
91 //系统默认会通过手机浏览器打开网页,为了能够直接通过WebView显示网页,则必须设置
92 webView.setWebViewClient(new WebViewClient(){
93 @Override
94 public boolean shouldOverrideUrlLoading(WebView view, String url) {
95 //使用WebView加载显示url
96 view.loadUrl(url);
97 //返回true
98 return true;
99 }
100 });
101 }
102 }

关键代码就在于这一部分:

 在webview加载完成之后启动Timer,然后webView.post里面去调用js方法,接收返回值。

js(vue)端代码:

如果是传统js开发:

 1 <html>
2 <body onload="document.getElementById('ddd').innerHTML = a;">
3 <div>
4 <div id="ddd" style="font-size: 5rem; color: red;"></div>
5 <button style="width:200px;height:200px;font-size: 5rem;" onclick="testClick()">TEST</button>
6 </div>
7 <script>
8 setTimeout(() => {
9 console.log(manualCtrl())
10 }, 5000)
11
12 //setInterval(() => {
13 // document.getElementById('ddd').innerHTML = Math.random()
14 //}, 1000)
15
16 var a = 1;
17
18 function testClick() {
19 a = 2;
20 document.getElementById('ddd').innerHTML = a;
21 }
22
23 function manualCtrl() {
24 return a;
25 }
26 </script>
27 </body>
28 </html>

如果是vue开发:

 1 mounted() {
2 window.manualCtrl = this.manualCtrl
3 } ,
4 methods: {
5 manualCtrl(info) {
6 //info from android
7 //do something...
8 return Math.random()
9 }
10 }

android webview调用js(vue)问题记录的更多相关文章

  1. Android Webview 调用JS跳转到指定activity

    JAVA: WebView wv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(save ...

  2. WebView调用js方法获取返回值的完美解决方案

    在Android项目中我们或多或少会涉及到与js交互的问题,这其中WebView是必须掌握的控件,今天主要说说我们通过WebView调用js方法,然后如何很好的获取返回值.这里我总结了三种方式,大家可 ...

  3. android 中webview调用js

    1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  4. [android] WebView与Js交互

    获取WebView对象 调用WebView对象的getSettings()方法,获取WebSettings对象 调用WebSettings对象的setJavaScriptEnabled()方法,设置j ...

  5. Android Webview 与JS交互

    Android中 WebView控件支持JS与本地代码的交互. // 是否允许在webview中执行javascript webSettings.setJavaScriptEnabled(true); ...

  6. android webview与js简单的交互方案

    最近研究webview与js交互,看了几个开源库实现,感觉不尽如人意,存在主要问题是,耦合较高,使用不够简洁,后来参考Uri设定规则,格局Uri类似协议自定义了类似的js交互协议 比较简洁,自定义协议 ...

  7. android webview 中 js 模板引擎的使用

    最近在项目中要求用 webview 展示几个界面, 而后台返回的不是 html 而是 json 数据. 起初用 StringBuilder 一个一个拼 html, 后来感觉太繁琐,拼一个还行,拼多了就 ...

  8. Android WebView的Js对象注入漏洞解决方案

    http://blog.csdn.net/leehong2005/article/details/11808557/ webview调用以下文件,就可以打印sdcard 文件名 <!DOCTYP ...

  9. Xamarin Android Webview中JS调用App中的C#方法

    参考链接:https://github.com/xamarin/recipes/tree/master/Recipes/android/controls/webview/call_csharp_fro ...

  10. android Webview 实现js调用java代码实现Activity跳转

    今天有了一个需求,在android里webview加载的html页面,要求点击html页面的按钮实现Activity的跳转. 咱是是菜鸟,webview的接触不多,于是就和度娘来了次亲密接触.在其中也 ...

随机推荐

  1. {"status":-1,"statusText":"ERR_CONNECT_FAILED"}

    今日使用weex 的stream 遇到一个极坑,也极傻的问题 一.steam.fetch 下面是我使用steam.fetch调用后台接口都截图 二.页面测试 奇怪的是,我借同事是手机来进行测试,有一个 ...

  2. Python基础 - 解释性语言和编译性语言

    什么是机器语言 计算机是不能理解高级语言,当然也就不能直接执行高级语言了.计算机只能直接理解机器语言,所以任何语言,都必须将其翻译成机器语言,计算机才能运行高级语言编写的程序.   如何把我们写的代码 ...

  3. springboot+springsecurity+jwt+elementui图书管理系统

    ​​图书管理系统​​ 一.springboot后台 1.mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --> <dependency> < ...

  4. Lombok注解及其作用

    Lombok是一个Java库,通过使用注解简化Java类的开发,减少冗余的样板代码.以下是一些常用的Lombok注解及其作用: 1. `@Data`:生成所有属性的getter.setter.`toS ...

  5. IntelliJ IDEA 的安装

    IntelliJ IDEA 的安装 安装之前参考Win10环境配置(二) --Java篇 1. 下载软件 官网: IntelliJ IDEA 分两个版本,学习Java下Community版 2.安装 ...

  6. R 语言绘制环状热图

    作者:佳名来源:简书 - R 语言文集 1. 读取并处理基因表达数据 这是我的基因表达量数据: 图 Fig 1 > myfiles <- list.files(pattern = &quo ...

  7. 在Transformers 中使用约束波束搜索引导文本生成

    引言 本文假设读者已经熟悉文本生成领域波束搜索相关的背景知识,具体可参见博文 如何生成文本: 通过 Transformers 用不同的解码方法生成文本. 与普通的波束搜索不同,约束 波束搜索允许我们控 ...

  8. 解决适用EntityFramework生成时报错“无法解析依赖项。"EntityFramework 6.4.4" 与 ' EntityFramework.zh-Hans 6.2.0 约束:EntityFramework(=6.2.0)'不兼容。"

    起因:通过vs2022创建mvc项目时, 执行添加"包含视图的MVC5控制器(使用Entity Framework)时 点击添加,出现错误提示  解决方法: 在您的解决方案资源管理器中,右键 ...

  9. 安装部署 Kubernetes 仪表板(Dashboard)

    简介 Kubernetes 仪表板(Dashboard)是基于网页的 Kubernetes 用户界面. 你可以使用仪表板: 展示了 Kubernetes 集群中的资源状态信息和所有报错信息. 把容器应 ...

  10. 01-C语言基础语法

    目录 一. C语言发展史 二. 数据类型 三. 常量和变量 四. 字符串和转义字符 五. 选择语句 六. 循环语句 七. 函数 一. C语言发展史 1963 年ALGOL 60 作为C语言最早的模型, ...