Hybrid开发—WebView与js交互实现

Hybrid 原生App与Web混合开发介绍及更新 项目中用到JS与原生App之间的数据通信,IOS那边提供了一个WebViewJavascriptBridge,故‘研究‘了一下。github地址: https://github.com/marcuswestin/WebViewJavascriptBridge先看实例,后面有详细说明 阅读详情

Hybrid开发—WebView与js交互实现

一、 引言

Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好交互体验的优势”和“Web App跨平台开发的优势”。

当前Hybrid技术也分了几个门派,其中主流的两派——

  • 一派是采用ReactNative或者weex之类的框架来实现,通俗点说就是程序员用js写代码,然后框架负责把js代码翻译成原生代码,最后呈现出原生页面;
  • 另外一派是采用WebView组件,程序员写的是纯粹的h5代码,最后也是通过原生端的WebView组件来加载渲染,和WebApp的区别就是,WebApp整个app是一个web容器,各种页面跳转包括效果实现都是在这个容器中通过H5技术实现。
    而Hybrid-WebView的实现方案中,每个页面都是一个独立的WebView容器,页面之间的跳转,一些特殊效果,特殊组件的实现,都是通过H5发消息来调取原生功能实现的。

二、WebView与js交互

一、WebView

WebView组件是Android提供用于显示网页信息,它内置了WebKit引擎,WebKit是一个开源的浏览器引擎,Chrome浏览器也是基于它,所以我们可以把WebView当做一个轻量级的浏览器使用。如果对WebView的使用以及方法不是很了解,可以看Android:这是一份全面 & 详细的Webview使用攻略这篇文章,这里面讲解了WebView 的基本使用。

二、交互小Demo

下面我们进入正题,WebView 是如何与JS 进行交互的。请看下面这个图片:
在这里插入图片描述
蓝色的部分是WebView控件,加载的是本地的一个HTML 网页。黄色的是app 本身的布局,在输入框中输入数据然后点击发送,就能把数据发送给Js进行处理,在网页中点击发送按钮,也同样的能把网页中输入框内的数据发送给app 本身并显示出来,这个小Demo 就简单的实现了WebView与js 整个的交互过程。下面看整个交互过程图:
在这里插入图片描述
OK ,下面我们来实现这个小Demo。

三、具体实现

1、首先是界面xml 布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.sxl.webviewdemo.MainActivity">

    <!--显示网页区域-->
    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:background="#F8DC26">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="这里是Native"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tv_Data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"
            android:text="从HTML返回的数据"
            android:textSize="20sp" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:orientation="horizontal">

            <EditText
                android:id="@+id/edtTxt_Data"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:layout_weight="1"
                android:gravity="center"
                android:hint="输入的数据将在HTML中显示" />

            <Button
                android:id="@+id/btn_Send"
                android:layout_width="60dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginRight="20dp"
                android:text="发送" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>
2、初始化webView控件
				mWebview = (WebView) findViewById(R.id.webView);

        // 获取mWebSettings 对WebView进行配置和管理
        mWebSettings = mWebview.getSettings();

        // 允许webview 加载js代码
        mWebSettings.setJavaScriptEnabled(true);
        // 加载本地html   
        mWebview.loadUrl("file:///android_asset/WebViewDemo.html");

        //设置不用系统浏览器打开,直接显示在当前Webview
        mWebview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        //设置WebChromeClient类
        mWebview.setWebChromeClient(new WebChromeClient() {
            //获取网站标题
            @Override
            public void onReceivedTitle(WebView view, String title) {
                getSupportActionBar().setTitle(title);
            }
        });
3、创建WebViewDemo.html文件

创建WebViewDemo.html文件,并将这个HTML文件放入到main 文件夹下的assets 文件夹内,如果没人assets 这个文件吗,则创建。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebView小Demo</title>
    <style type="text/css">
        body{
            background: #61aaff;
        }
    </style>
</head>
<body>
<h2>这里是HTML网页</h2>
<div><span>要输入的数据:</span><input type="text" id="input"></div><br>
<button id="button">发送给Android</button>
</body>
</html>
4、Android通过WebView的 loadUrl方法调用 JS 代码

首先在WebViewDemo.html 创建 js 方法

<script type="text/javascript">
    var data=document.getElementById("input");
    // 定义js 方法,会被 Android 调用
    var send=function(str) {
        data.value=str;
    }
</script>

在Android中调用js 方法

				btnSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = edtTxtData.getText().toString();
              	// 调用js 中的send 方法并传参
                mWebview.loadUrl("javascript:if(window.send){window.send('" + str + "')}");
            }
        });
5、JS通过WebView 的addJavascriptInterface 方法调用 Android 代码(4.2及以上的系统才能使用)

首先定义一个 JSInterface.java 接口文件,定义 setVaule 方法。

public interface JSInterface {

    void setVaule(String vaule);
}

然后 JStoAndroid 类中实现这个方法。

public class JStoAndroid {

    private JSInterface jsInterface;

    public JStoAndroid(JSInterface jsInterface){
        this.jsInterface=jsInterface;
    }

    /**
     * 定义JS需要调用的方法
     * 被JS调用的方法必须加入@JavascriptInterface注解
     * 这种方式只能在Android 4.2及以上的系统才能使用
     */
    @JavascriptInterface
    public void setValue(String vaule) {
        jsInterface.setVaule(vaule);
    }
}

下面在主界面中 加载 js 接口:

				// 给webView 加载js 接口
        mWebview.addJavascriptInterface(new JStoAndroid(new JSInterface() {
            @Override
            public void setVaule(final String vaule) {
                // 将在js 接口中获取到的数据 通过handler 传到主线程更新界面
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        tvData.setText(vaule);
                    }
                });
            }
        }), "sendData");   // "sendData" 对应 js中 调用的方法名

最后添加 html 中按钮点击的 js 方法。

<script type="text/javascript">
    var btn=document.getElementById("button");
    var data=document.getElementById("input");
    // 调用Android 中的方法
    btn.addEventListener("click",function () {
        var str=data.value;
        // 判断 Android 加载js 接口的时候有没有定义的sendData 方法
        if( window.sendData ){
            sendData.setValue(str);
        }else{
            alert("Android 中没有对应的方法");
        }
    });
</script>

总结:

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

  1. 通过WebView的loadUrl()
  2. 通过WebView的evaluateJavascript()

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

  1. 通过WebView的addJavascriptInterface()进行对象映射
  2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
  3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

以上就是对Android与js 直接交互实现的小Demo 的讲解,具体代码已经上传到github,点击 WebViewDemo 即可查看。

Hybrid与h5使用webview+JSBridge实现通信原理简析 目录 一、概念了解: webview - 承载和渲染网页的容器 JSBridge - 封装(了一系列js与native互通数据)的js方法 二、简易流程图: 三、详解流程: 第一步: 设计出一个Native与JS交互的全局桥对象 第二步: JS调用Native功能实现-callHandler 内部实现 第三步: Native监听api调用,捕获这个url 第四步: Native分析url-api名、回调和参数的格式 第五步: Native调用JS功能实现 第六步: H5中api方法的. 阅读详情

相关推荐

Android Hybrid开发入门:原生Android与JS的交互

我们知道,现在App大致分为3类:Hybrid App、Web App、Native App。Hybrid App兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”,市面上现在也有许多Hybrid App。最近做的项目,也会使用到Hybrid开发,之前没做过的。所以今天初步学习了一下,记录一下学习心得。首先,新建一个新的AS module。然后新建assets目录

lastwarmth的博客 2559

Hybird开发,webview和H5交互

封装一个统一的接口,供H5页面调用原生的功能,比如获取设备信息、打开相机、分享内容等。这样,H5页面只需调用这个接口,而无需关心具体的原生实现细节。

little xian的博客 2471

Yoda简介

比起原生的api发送网络请求从而获取服务端页面内容,H5是通过原生app,在打开app的同时(仅资源发生变更的时候请求服务端)就把服务器的页面全部请求过来,当我们打开页面时,直接从本地拿来渲染执行js即可,也就是做了预加载页面的处理,效率提升。3. APP协议:file协议(用于打开本地文件,优点是速度快,直接在webview中调用)、https协议(需要发送网络请求,相对file较慢)、schema协议(用于客户端和前端通讯的协议)2.4 RN:兼顾性能、体验和开发效率,但学习成本高,需要前期投入。

Sabrina_FN的博客 420

论Web App、Hybrid App、Native App设计差异

目前主流应用程序大体分为三类:Web App、Hybrid App、 Native App。 一、Web App、Hybrid App、Native App 纵向对比 首先,我们来看看什么是 Web App、Hybrid App、 Native App。 (1)Web APP Web App 指采用Html5语言写出的App,不需要下载安装。类似于现在所说的轻应用。生存在浏览器中...

591

【Arduino】入门篇——交通信号灯

模拟交通信号灯一、实验目的二、实验材料三、电路图四、实验过程五、代码块六、实验结果 一、实验目的 我想大家都看见过交通灯,就是马路上十字路口的红绿灯。如果您开过车,我想您一定仔细观察过交通灯,如果您还没有驾驶过车,您是否仔细观察过交通灯呢?交通灯包括三种个不同颜色的灯:红灯、黄灯和绿灯。 每个路口的红绿灯切换的时间并不是相同,这个是根据不同路口的车流情况来设定的,下面就是模仿交通灯的一个实验 二...

漠宸离若的博客 1万+

MEMS惯性传感器关键参数解析与误差优化策略

本文深入解析了MEMS惯性传感器的关键性能参数,如零偏稳定性、噪声与随机游走、振动整流误差等,并阐述了这些误差如何导致设备导航漂移、姿态不稳等问题。文章重点探讨了从硬件选型、系统设计到校准补偿、算法融合(如卡尔曼滤波)以及温度补偿等实战优化策略,旨在帮助工程师有效提升自动驾驶、无人机等设备的测量精度与稳定性。

weixin_28363123的博客 414

Hybird和WebView

WebView是一个原生组件,它可以在应用中嵌入网页内容。它的主要作用是渲染和展示Web内容,在Hybrid开发中尤为重要。它使得应用能够在原生界面内直接加载网页、显示Web页面,或者运行Web应用,而无需跳转到外部浏览器。WebView不仅仅是展示HTML页面,还可以与JavaScript和原生代码交互。通过WebView,开发者能够在不跳出应用的情况下,实现页面加载、内容渲染、甚至复杂的Web应用功能。在Hybrid开发模式下,iOS和Android应用通过WebView。

lonelyhiker 1219

实现画布拖拽算子排布,通过flink实现算子编排计算,如何实现?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1070

JSBridge-Android:高效、安全的Hybrid开发利器

JSBridge-Android:高效、安全的Hybrid开发利器 在移动应用开发领域,Hybrid开发模式因其灵活性和高效性而受到广泛欢迎。然而,实现JavaScript与原生代码之间的无缝交互一直是开发者面临的挑战。今天,我们向您推荐一款开源项目——JSBridge-Android,它为Android开发者提供了一个高效、安全的解决方案。 项目介绍 JSBridge-Android是一个基于W...

gitblog_00728的博客 1075

第一讲:halcon模板匹配捆绑测量矩形检测芯片针脚

使用halcon模板匹配捆绑测量矩形,检测位置发生变换的芯片针脚缺陷。

uiopmn1的博客 2994

【Unity小游戏】整整一个周末写一款《皇室战争 玩法》 的 即时战斗类 游戏Demo。两万多字游戏制作过程+解析

Unity游戏制作,本篇文章介绍了复刻皇室战争玩法的一个自制小游戏,共有该游戏的两万字教程加制作过程,欢迎品尝! 世界上没有绝对的公平,如果我们起点就比别人第一步,那就更需要比别人努力了。

努力前行,总会成为自己心中的那道光 12万+

android 混合hybrid,Hybrid混合开发知识点(一)

Hybrid是半Native半Web开发模式,充分利用H5的跨平台、快速迭代能力以及Native的流畅性、系统API调用能力,具有可复用性高、开发成本低、跨平台开发的特点。在阐述Hybrid混合开发知识点之前,我们先梳理下WebView加载H5页面及H5与Android的交互等方面的知识点。WebView常用API及属性配置WebViewClient类:处理各种通知&请求事件。常用方法如下...

weixin_34170737的博客 697

【MicroPython编程-ESP32篇:设备驱动】-SHT31温度湿度传感器驱动

SHT31 是 Sensirion 的下一代温湿度传感器。 它建立在一个新的 CMOSens® 传感器芯片之上,该芯片是 Sensirion 新湿度和温度平台的核心。

视觉与物联智能 228

hybrid开发js与原生交互的原理

Hybrid 里 JS 与原生交互,本质就是基于 WebView 建立一套双向消息通信机制,JS 通过 bridge 调原生,原生再通过执行 JS 或事件回调把结果返回。

2302_81102841的博客 232

mpv 源码深度解析:从 MPlayer 遗产到现代媒体播放器架构

做减法优于做加法:不值得维护的功能就移除(DVD 菜单、流缓存等)单线程事件驱动:核心逻辑在单线程中运行,通过 dispatch 队列处理并发分离关注点:demuxer 线程、VO 线程、脚本线程各司其职质量优先:使用 GPU 着色器而非固定功能硬件,默认软件解码(更可靠)可嵌入性:libmpv API 让 mpv 可以作为库嵌入其他应用mpv 是一个用纯 C 实现的、工程质量极高的媒体播放器。它的代码库展示了一个事实:C 语言完全可以通过良好的架构设计来实现复杂的多媒体系统。

世界那么大,我想去看看~【随心更新,看世界去了😄】 85

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android中使用WebView与JS交互全解析

优快云 2016-11-29 10:23 首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发。为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,Android和iOS两边都要维护同一套界面甚至是逻辑,这样开发和维护的成本会很大,而使用hybrid的开发方式的话,让前端的同学去写一套界面和逻辑,对于na

u011277123的博客 359

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Android-WebView篇--将方法提供给HTML来使用

PS:一篇短小的webView文章,作为对于之前webView总结的补充。 了解更多android的知识可以看笔者的其他博客哟~ Android–关于webView 零散知识点就用⚡️图标代替吧。 ⚡️webView组件本身就是一个浏览器实现,WebView基于Chromium内核实现。 第一节:使用WebView浏览网页的常用方法 常用方法: ⚡️goBack():后退 ⚡️goForward():前进 ⚡️loadUrl(String url):加载指定URL对应的网页。 ⚡️boolean zoomI

m0_56396386的博客 2280

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

谈谈App混合开发

混合开发的App(Hybrid App)就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发,这部分功能不仅能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,让用户的体验更好又可以节省开发的资源。 下面来谈谈Hybrid App开发中的技术问题。iOS方面的我不太了解,我就主要谈谈Android开发中的,其中可能会有很多说错的

richie0006的博客 7859

Android WebView 与JS的数据交互

关于WebView 我们知道目前android市场上的一些应用采用的开发方式大致分为三种:Native App、Web App、Hybrid App。本文主要是Hybrid App中实现的主要技术native组件与js的数据交互的理解以及实现。   Android API中提供了WebView组件来实现对html的渲染。所谓的HybridApp开发方式即是汇集了HTML5、C

z69183787的专栏 940

Android自定义schema,android hybird 实现:自定义schema

android hybird 与h5 app区别hybird 与h5 app是不一样的,以前对这两者理解有所误解,在实际开发中也并未真正采用hybird,而是使用h5+app外壳实现移动端应用。虽然开发出来的应用实现了无需升级app实现主功能更新,但是交互体验上较原生相差甚多。Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native...

weixin_39762441的博客 278

Android App混合开发----Hybrid开发

混合开发的App(Hybrid App)就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发,这部分功能不仅能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,让用户的体验更好又可以节省开发的资源。 下面来谈谈Hybrid App开发中的技术问题。iOS方面的我不太了解,我就主要谈谈Android开发中的,其中可能会有很多说错的

安逸猿 1366

终极指南:如何利用AgentWeb打造高性能Android WebView应用

AgentWeb是一个基于Android WebView的强大库,为开发者提供了增强的WebView功能和性能优化方案。本文将深入解析AgentWeb的架构设计与性能优化技巧,帮助新手和普通用户快速掌握这一工具的核心优势和使用方法。 ## AgentWeb核心架构解析 AgentWeb采用了模块化的架构设计,使其具有高度的可扩展性和灵活性。核心组件包括AgentWeb主类、IndicatorC

gitblog_00018的博客 747

谈谈Android App混合开发

混合开发的App(Hybrid App)就是在一个App中内嵌一个轻量级的浏览器,一部分原生的功能改为Html 5来开发,这部分功能不仅能够在不升级App的情况下动态更新,而且可以在Android或iOS的App上同时运行,让用户的体验更好又可以节省开发的资源。 下面来谈谈Hybrid App开发中的技术问题。iOS方面的我不太了解,我就主要谈谈Android开发中的,其中可能会有很多说错的

709
上一篇: Android快速生成MVP 模式代码
下一篇: 解决Android Studio 安装APK时device support,but apk only supports armeabi-v7 。问题
谦行
博客等级 码龄11年 182粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值