这几天和别人对接移动端,安卓平台,我们这边输出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. vue全家桶进阶之路10:修饰符

    Vue2 中的修饰符是指在指令后面添加点号(.)和修饰符名称的方式,用于控制指令的行为.修饰符可以分为事件修饰符和属性修饰符两种类型,下面分别介绍它们的作用和使用方法. 事件修饰符 事件修饰符用于控制 ...

  2. 为什么有了 HTTP 还要 RPC

    哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用.在分布式架构下,为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用 而这时候就需要一种协议来支持远程过程调用,以便实现 ...

  3. 在开发过程中使用git rebase还是git merge,优缺点分别是什么?

    前言 在开发过程中,git rebase 和 git merge 都是常见的代码版本管理工具.它们都能够将分支合并到主分支,并且都有各自的优缺点. git merge git merge 是一种将两个 ...

  4. Java配置线程池

    一.Java配置线程池 1.线程池分类.其他 1.1.分类 IO密集型 和 CPU密集型 任务的特点不同,因此针对不同类型的任务,选择不同类型的线程池可以获得更好的性能表现. 1.1. IO密集型任务 ...

  5. Three.js 进阶之旅:滚动控制模型动画和相机动画 🦢

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 摘要 专栏上篇文章<Three.js 进阶之旅:页面*滑滚动-王国之泪&g ...

  6. C# decimal double 获取一组数字 小数点后最多有几位

    有一组数字,想判断一组数字中最多的有几位小数,乘以10的指定幂,转为整数,此处教大家一个高级的写法,拒接无脑for循环 decimal: decimal[] numbers = new decimal ...

  7. webGPU orillusion(一)

    关于架构的理解与认识   Orillusion 核心借鉴了 ECS 结构,遵循 组合优于继承 的开发设计原则,实现了自己的组件系统.我们将传统复杂的逻辑划分为独立的.可重复利用的部分,每个部分可以单独 ...

  8. 让优惠再续一年!SHPC 老客专享

    最近云筏君经常收到自家小伙伴发来的关于产品活动的关心慰问,掐指一算,哦,原来是一年一度大家喜闻乐见的剁手节(学名"双十一")马上要来了! 大家都知道,云筏家的产品向来主打高性价比, ...

  9. Anaconda入门使用指南(二)

    Anaconda 安装完成,在 bin 子目录下( $PREFIX/bin )可以看到该发行版本预装好的 conda.python.pip.jupyter,以及一些常用的工具. Python环境管理 ...

  10. Dubbo远程调用在IDEA无法打断点怎么破

     以下是如何在IDEA中在Dubbo的分布式环境中设置远程调试的步骤: 1.首先,你需要在启动提供者服务时,加入一些JVM参数以开启调试服务.这些参数应该在你的启动脚本或者命令中.以下是一个常见的示例 ...