Android-Java和HTML5交互-混合开发-优化

2023-10-28

现在很多的 APP中会嵌套HTML5的页面,比如经常变化的等等,有一部分页面需要原生Java与HTML5中的js进行交互操作,下面介绍一下android中HTML5的使用:

1、关于HTML5种cookie

  网页中可能会用到 用户信息等很多参数,可以提前把这些信息放到cookie中,可以采用以下方法: 

 1 public static void addCookies(Context context, WebView webView, String url) {
 2 
 3 String url=“https://www.xxxx.com/xx/xx/”
 4         String protocol = "";
 5         String authority = "";
 6         try {
 7             URL urlObj = new URL(url);
 8             protocol = urlObj.getProtocol();
 9             authority = urlObj.getAuthority();
10         } catch (Exception e1) {
11             e1.printStackTrace();
12         }
13 
14         String ua = webView.getSettings().getUserAgentString();
15         webView.getSettings().setUserAgentString(Constant.PROJECT_NAME + "/" + ParamHandler.getVersion(context) + "(" + ua + "; HFWSH)");
16 
17         if (!TextUtils.isEmpty(url) && !TextUtils.isEmpty(protocol) && !TextUtils.isEmpty(authority)) {
18             if (protocol.equals("https") && authority.indexOf("liepin.com") > -1) {
19                 CookieSyncManager.createInstance(context);
20                 CookieManager cookieManager = CookieManager.getInstance();
21                 cookieManager.setAcceptCookie(true);
22                 try {
23                     List<String> data = getCookiesString();
24                     if (!ListUtils.isEmpty(data)) {
25                         for (String value : data) {
26                             cookieManager.setCookie(url, value);
27                         }
28                     }
29                     cookieManager.setCookie(url, "client_id=" + Constant.CLIENT_ID + ";path=/;domain=.XXXX.com");
30                     cookieManager.setCookie(url, "appVersion=" + Constant .VERSION + ";path=/;domain=.XXXX.com"); 
31             CookieSyncManager.getInstance().sync(); 
32         } catch (Exception e) { 
33             LogUtils.e("Exception:" + e.getMessage()); 
34         } 
35       } 
36     } 
37   }

 
   
 
 1 public List<String> getCookiesString() {
 2     ArrayList data = new ArrayList();
 3     this.clearExpired();
 4     Collection values = this.mCookies.values();
 5     Iterator var3 = values.iterator();
 6 
 7     while(var3.hasNext()) {
 8         SwiftCookie c = (SwiftCookie)var3.next();
 9         data.add(c.toCookieString());
10     }
11 
12     return data;
13 }

 

  在 mWebView.loadUrl(Url)之前添加cookie,网页就可以通过cookie取到相应的参数值了。

2、关于js的安全问题

  js在4.2以前有漏洞

  通过JavaScript,可以访问当前设备的SD卡上面的任何东西,甚至是联系人信息,短信等。好,我们一起来看看是怎么出现这样的错误的。

  1,WebView添加了JavaScript对象,并且当前应用具有读写SDCard的权限,也就是:android.permission.WRITE_EXTERNAL_STORAGE

  2,JS中可以遍历window对象,找到存在“getClass”方法的对象的对象,然后再通过反射的机制,得到Runtime对象,然后调用静态方法来执行一些命令,比如访问文件的命令.

  3,再从执行命令后返回的输入流中得到字符串,就可以得到文件名的信息了。然后想干什么就干什么,好危险。核心JS代码如下:

 
 
 1 function execute(cmdArgs)  
 2 {  
 3     for (var obj in window) {  
 4         if ("getClass" in window[obj]) {  
 5             alert(obj);  
 6             return  window[obj].getClass().forName("java.lang.Runtime") 7 .getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs); 8  } 9  } 10 } 
 
 

解决方案:

  1,Android 4.2以上的系统

  在Android 4.2以上的,google作了修正,通过在Java的远程方法上面声明一个@JavascriptInterface,如下面代码:

  1. 1 class JsObject {  
    2    @JavascriptInterface  
    3    public String toString() { return "injectedObject"; }  
    4 }  
    5 webView.addJavascriptInterface(new JsObject(), "injectedObject");  
    6 webView.loadData("", "text/html", null); 7 webView.loadUrl("javascript:alert(injectedObject.toString())"); 
  2,Android 4.2以下的系统
 
 

  这个问题比较难解决,但也不是不能解决。

  首先,我们肯定不能再调用addJavascriptInterface方法了。关于这个问题,最核心的就是要知道JS事件这一个动作,JS与Java进行交互我们知道,有以下几种,比prompt, alert等,

  这样的动作都会对应到WebChromeClient类中相应的方法,对于prompt,它对应的方法是onJsPrompt方法,这个方法的声明如下:

 

  1. public boolean onJsPrompt(WebView view, String url, String message,   
  2.     String defaultValue, JsPromptResult result)  

 

  通过这个方法,JS能把信息(文本)传递到Java,而Java也能把信息(文本)传递到JS中,通知这个思路我们能不能找到解决方案呢?

  经过一番尝试与分析,找到一种比较可行的方案,请看下面几个小点:

  【1】让JS调用一个Javascript方法,这个方法中是调用prompt方法,通过prompt把JS中的信息传递过来,这些信息应该是我们组合成的一段有意义的文本,可能包含:特定标识,方法名称,参数等。

    在onJsPrompt方法中,我们去解析传递过来的文本,得到方法名,参数等,再通过反射机制,调用指定的方法,从而调用到Java对象的方法。

  【2】关于返回值,可以通过prompt返回回去,这样就可以把Java中方法的处理结果返回到Js中。

  【3】我们需要动态生成一段声明Javascript方法的JS脚本,通过loadUrl来加载它,从而注册到html页面中,具体的代码如下:

 1 javascript:(function JsAddJavascriptInterface_(){  
 2     if (typeof(window.jsInterface)!='undefined') {      
 3         console.log('window.jsInterface_js_interface_name is exist!!');}   
 4     else {  
 5         window.jsInterface = {          
 6             onButtonClick:function(arg0) { 7 return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onButtonClick',args:[arg0]})); 8  }, 9 10 onImageClick:function(arg0,arg1,arg2) { 11 prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onImageClick',args:[arg0,arg1,arg2]})); 12  }, 13  }; 14  } 15 } 16 )() 

 

  说明:
 
 

  1,上面代码中的jsInterface就是要注册的对象名,它注册了两个方法,onButtonClick(arg0)和onImageClick(arg0, arg1, arg2),如果有返回值,就添加上return。

  2,prompt中是我们约定的字符串,它包含特定的标识符MyApp:,后面包含了一串JSON字符串,它包含了方法名,参数,对象名等。

  3,当JS调用onButtonClick或onImageClick时,就会回调到Java层中的onJsPrompt方法,我们再解析出方法名,参数,对象名,再反射调用方法。
  4,window.jsInterface这表示在window上声明了一个Js对象,声明方法的形式是:方法名:function(参数1,参数2) 



3、在html5中进行java和js的交互

  1)、方法一:

  mWebView.getSettings().setJavaScriptEnabled(true);

  mWebView.addJavascriptInterface(this, "xxx");
  然后在当前类中实现以下方法:

  @JavascriptInterface
  public void callbackFromH5(final String j) {
    //TODO
  }

  callbackFromH5的名字必须和网页中的js方法名一样

  Java调用js方法:
   mWebView.loadUrl(String.format("javascript:java2js(0)"));//这里是java端调用webview的JS  
  js方法名需要和网页端一直

  2)方法二:
  jsbridge方法(https://github.com/lzyzsd/JsBridge)
  Android JsBridge 就是用来在 Android app的原生 java 代码与 javascript 代码中架设通信(调用)桥梁的辅助工具

  1 将jsBridge.jar引入到我们的工程 

  Android Studio:         
  repositories {
      // ...
      maven { url "https://jitpack.io" }
  }
  dependencies {
      compile 'com.github.lzyzsd:jsbridge:1.0.4'   }
  2、布局文件
 1 <?xml version="1.0" encoding="utf-8"?>  
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 3     android:layout_width="match_parent"  
 4     android:layout_height="match_parent"  
 5     android:orientation="vertical" >  
 6   
 7     <!-- button 演示Java调用web -->  
 8     <Button   
 9         android:id="@+id/button"  
10         android:layout_width="match_parent"  
11         android:text="@string/button_name"  
12         android:layout_height="48dp"  
13         />  
14       
15     <!-- webview 演示web调用Java -->  
16     <com.github.lzyzsd.jsbridge.BridgeWebView  
17         android:id="@+id/webView"  
18         android:layout_width="match_parent"  
19         android:layout_height="match_parent" >  
20      </com.github.lzyzsd.jsbridge.BridgeWebView>  
21   
22 </LinearLayout>  

3、java代码

 1 //加载服务器网页  
 2         webView.loadUrl("https://www.baidu.com");  
 3   
 4         //必须和js同名函数。  
 5         webView.registerHandler("submitFromWeb", new BridgeHandler() {  
 6   
 7             @Override  
 8             public void handler(String data, CallBackFunction function) {  
 9   
10                 String str ="html返回给java的数据:" + data;  
11               
12                 makeText(MainActivity.this, str, LENGTH_SHORT).show();  
13   
14                 Log.i(TAG, "handler = submitFromWeb, data from web = " + data);  
15                 function.onCallBack( str + ",Java经过处理后:"+ str.substring(0,5));  
16             }  
17   
18         });  
19         //模拟用户获取本地位置  
20         User user = new User();  
21         Location location = new Location();  
22         location.address = "xxx";  
23         user.location = location;  
24         user.name = "Bruce";  
25   
26         webView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() {  
27             @Override  
28             public void onCallBack(String data) {  
29                 makeText(MainActivity.this, "网页在获取你的信息", LENGTH_SHORT).show();  
30   
31             }  
32         });  
33   
34         webView.send("hello");  
1  webView.callHandler("functionInJs", "data from Java", new CallBackFunction() {  
2   
3                 @Override  
4                 public void onCallBack(String data) {  
5                     // TODO Auto-generated method stub  
6                     Log.i(TAG, "reponse data from js " + data);  
7                 }  
8   
9             });  

js调用

 1 var str1 = document.getElementById("text1").value;  
 2            var str2 = document.getElementById("text2").value;  
 3   
 4            //调用本地java方法  
 5            window.WebViewJavascriptBridge.callHandler(  
 6                'submitFromWeb'  
 7                , {'param': str1}  
 8                , function(responseData) {  
 9                    document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData  
10                }  
11            );  
12 
13 //注册事件监听 
14  document.addEventListener(  
15                    'WebViewJavascriptBridgeReady'  
16                    , function() {  
17                        callback(WebViewJavascriptBridge)  
18                    },  
19                    false  
20                );  
21 
22 //注册回调函数,第一次连接时调用 初始化函数 
23 connectWebViewJavascriptBridge(function(bridge) {  
24            bridge.init(function(message, responseCallback) {  
25                console.log('JS got a message', message);  
26                var data = {  
27                    'Javascript Responds': 'Wee!'  
28                };  
29                console.log('JS responding with', data);  
30                responseCallback(data);  
31            });  
32   
33            bridge.registerHandler("functionInJs", function(data, responseCallback) {  
34                document.getElementById("show").innerHTML = ("data from Java: = " + data);  
35                var responseData = "Javascript Says Right back aka!";  
36                responseCallback(responseData);  
37            });  
38        })  

 

 



 
 

4、关于webView的优化

  1、设置WebView 缓存模式

 1     private void initWebView() {  
 2               
 3             mWebView.getSettings().setJavaScriptEnabled(true);  
 4             mWebView.getSettings().setRenderPriority(RenderPriority.HIGH);  
 5             mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);  //设置 缓存模式  
 6             // 开启 DOM storage API 功能  
 7             mWebView.getSettings().setDomStorageEnabled(true);  
 8             //开启 database storage API 功能  
 9             mWebView.getSettings().setDatabaseEnabled(true);   
10             String cacheDirPath = getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME;  
11     //      String cacheDirPath = getCacheDir().getAbsolutePath()+Constant.APP_DB_DIRNAME;  
12             Log.i(TAG, "cacheDirPath="+cacheDirPath);  
13             //设置数据库缓存路径  
14             mWebView.getSettings().setDatabasePath(cacheDirPath);  
15             //设置  Application Caches 缓存目录  
16             mWebView.getSettings().setAppCachePath(cacheDirPath);  
17             //开启 Application Caches 功能  
18             mWebView.getSettings().setAppCacheEnabled(true); 

  2、清除缓存

 1  /** 
 2          * 清除WebView缓存 
 3          */  
 4         public void clearWebViewCache(){  
 5               
 6             //清理Webview缓存数据库  
 7             try {  
 8                 deleteDatabase("webview.db");   
 9                 deleteDatabase("webviewCache.db");  
10             } catch (Exception e) {  
11                 e.printStackTrace();  
12             }  
13               
14             //WebView 缓存文件  
15             File appCacheDir = new File(getFilesDir().getAbsolutePath()+APP_CACAHE_DIRNAME);  
16             Log.e(TAG, "appCacheDir path="+appCacheDir.getAbsolutePath());  
17               
18             File webviewCacheDir = new File(getCacheDir().getAbsolutePath()+"/webviewCache");  
19             Log.e(TAG, "webviewCacheDir path="+webviewCacheDir.getAbsolutePath());  
20               
21             //删除webview 缓存目录  
22             if(webviewCacheDir.exists()){  
23                 deleteFile(webviewCacheDir);  
24             }  
25             //删除webview 缓存 缓存目录  
26             if(appCacheDir.exists()){  
27                 deleteFile(appCacheDir);  
28             }  
29         }  

  3、在使用WebView加载网页的时候,有一些固定的资源文件如js/css/图片等资源会比较大,如果直接从网络加载会导致页面加载的比较慢,而且会消耗比较多的流量。所以这些文件应该放在assets里面同app打包。

  解决这个问题用到API 11(HONEYCOMB)提供的shouldInterceptRequest(WebView view, String url) 函数来加载本地资源。

  API 21又将这个方法弃用了,是重载一个新的shouldInterceptRequest,需要的参数中将url替换成了成了request。

  比如有一个图片xxxxx.png,这个图片已经放在了assets中,现在加载了一个外部html,就需要直接把assets里面的图片拿出来加载而不需要重新从网络获取。当然可以在html里面将图片链接换成file:///android_asset/xxxxx.png,

  但是这样这个html就不能在Android ,ios,WAP中公用了。

 1 webView.setWebViewClient(new WebViewClient() {  
 2   
 3             @Override  
 4             public WebResourceResponse shouldInterceptRequest(WebView view, String url) {  
 5                 WebResourceResponse response = null;  
 6                 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB){  
 7                     response = super.shouldInterceptRequest(view,url);  
 8                     if (url.contains("xxxxx.png")){  
 9                         try {  
10                             response = new WebResourceResponse("image/png","UTF-8",getAssets().open("xxxxx.png"));  
11                         } catch (IOException e) {  
12                             e.printStackTrace();  
13                         }  
14                     }  
15                 }  
16 //                return super.shouldInterceptRequest(view, url);  
17                 return  response;  
18             }  
19   
20             @TargetApi(Build.VERSION_CODES.LOLLIPOP)  
21             @Override  
22             public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {  
23                 WebResourceResponse response = null;  
24                 response =  super.shouldInterceptRequest(view, request);  
25                 if (url.contains("xxxxx.png")){  
26                     try {  
27                         response = new WebResourceResponse("image/png","UTF-8",getAssets().open("xxxxx.png"));  
28                     } catch (IOException e) {  
29                         e.printStackTrace();  
30                     }  
31                 }  
32                 return response;  
33             }  
34 }  

 

 
1
 
 

 

当你追求卓越的时候,成功会追着你!



原地址:http://www.cnblogs.com/xunzhi/p/6023190.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android-Java和HTML5交互-混合开发-优化 的相关文章

  • Android-Java和HTML5交互-混合开发-优化

    现在很多的 APP中会嵌套HTML5的页面 比如经常变化的等等 有一部分页面需要原生Java与HTML5中的js进行交互操作 下面介绍一下android中HTML5的使用 1 关于HTML5种cookie 网页中可能会用到 用户信息等很多参
  • android 注册页面实现

    自己动手做的第一个demo 简单的注册页面的实现 并且注册成功后返回注册信息 适用于android新手基本控件的使用 注册页面的实现 import android os Bundle import android app Activity
  • 关于软件设计使用中一些的原则简述

    概述 向大家介绍过一些软件开发的原则 比如优质代码的十诫和Unix传奇 下篇 中所以说的UNIX的设计原则 相信大家从中能够从中学了解到一些设计原理方面的知识 正如我在 再谈 我是怎么招聘程序 中所说的 一个好的程序员通常由其操作技能 知识
  • 从Map中 取出第一个key/第一个value的方法

    从Map中取出第一个 key 和 value 的方法 使用Map Entry进行操作 可与LinckedHashMap 按元素存入顺序排序的有序Hash表 搭配使用 实现特定的业务要求 获取map中第一个key值 param map 数据源
  • Android网络编程的Socket通信简述

    概述 本文主要介绍Android中的网络编程的Socket通信一下小小总结 创建服务器端的步骤 1 指定端口实例化一个ServerSocket 2 调用ServerSocket的accept方法等待连接期间阻塞 3 获取位于底层的Socke
  • SVN文件夹图标不正常显示解决方案(win10)android studio

    在使用Android Studio提交代码时发现svn图标莫名其妙的不显示 其他操作都正常 在网上搜了一堆资料都有各种说法 结合了操作 一步步来试终于给我找到了 在这我自己总结一下 一部分也是拷贝别的图片 写一篇清楚文章好希望能帮助和我遇到
  • Android studio安装教程(2020/11/20最新版本的安装)

    一 安装前提 系统已经安装了jdk 而且版本在1 8以上 打开命令提示符界面 输入java version 切记之间有空格 就可以查看自己jdk安装版本了 二 安装准备 在官网下载最新安装包 接收协议进行下载 三 安装步骤 双击安装包 点击
  • Android adb 输出指定app 错误日志

    查看错误日志 adb logcat E 按照时间查看日志 adb logcat v time
  • 2019最新 国内唯一的Android从程序员到架构师全套教程

    课程目标 国内唯一的Android从程序员到架构师全套视频教程 适用人群 Android开发至少两年经验的IT工程师 想深入了解Android开源平台的资深工程师 Android项目团队技术管理者 课程概述 遵循敏捷的迭代过程 从思想 方法
  • java 字符串示例

    概述 最近项目上 需求 需要Android端在一段字符串分包处理 在此做个笔录 1 code public class Main public static void main String args System out println
  • Android Studio 如何设置logcat(控制台)的缓存大小,增加logcat控制台条数

    在一些比较大型的项目Logcat条数会很多 由于LogCat控制台经常刷新 速度太快导致之前的日志被冲洗掉 这里教大家一个方法 可以避免这种情况发生 改下logcat的缓存 缓冲区 大小 做到显示更多的LogCat日志 1 去找你所安装的A
  • ubuntu搭建android编译环境

    本文来自linux与嵌入式技术Q群52240781 ubuntu12 04 14 04安装后搭建android编译环境 注安装的是64位ubuntu系统12 04或14 04 请安装ubuntu的LTS版即12 04或14 04 每2年发布
  • Android SIM卡识别加载流程

    文章目录 总述 代码路径 UICC框架 SIM卡识别加载流程 日志分析举例 总述 本文基于Android N Android 7 首先要知道SIM卡一般是挂载在CP侧 MODEM侧 的 由MODEM给予真正的上电 识别 通信等 然后通过AP
  • Volley 源码解析

    1 功能介绍 1 1 Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架 在 Google I O 2013 大会上发布 名字由来 a burst or emission of many t
  • Android NDK是什么

    官方给出的答案 Android NDK 是一套允许您使用原生代码语言 例如 C 和 C 实现部分应用的工具集 在开发某些类型应用时 这有助于您重复使用以这些语言编写的代码库 深入的学习 https developer android goo
  • android 实现自动输入文本效果

    此控件的功能是帮助用户实现自动输入 例如当用户输入一个字符后 能够根据这个字符提示显示出与之相关的数据 里面用到了一个适配器来实现此功能 源代码如下 package com example autosearch import android
  • Android 报错 : FATAL EXCEPTION:main 解决方法

    今天安卓开发课上碰到的新问题 前景提示 老师让我们自己试一下那个两个页面跳转的效果 于是我就开始写了 然后报错 解决方法 逐一排查 首先要看你mainfest xml里面有没有增加Activity 当然我是加了 但是他还报错 具体代码界面
  • Android Studio工具使用技巧

    作为一个Android开发者 熟练使用开发工具能让你工作效率提高 能让你少点加班 剩下时间学习其他的知识 是个多么好的事情 想高级攻城狮方向迈进 不费话了 直接进去主题 一 模版 1 1 for循环的使用 遍历集合的时候 对象 for就可以
  • 【Android Studio】Design editor is unavailable until next gradle sync.如何解决?

    Design editor is unavailable until next gradle sync 如何解决 打开一个网上开源的下载文件 在查看安卓页面布局 也就是控件布局时 会出现一个bug Design editor is unav
  • The style on this component requires your app theme to be Theme.MaterialComponents

    MD版本采用如下 implementation com google android material material 1 2 0 alpha01 再采用MD的Dialog的时候报标题错误 后经分析查找 当前版本强制APP主题为Mater

随机推荐

  • Exchange Powshell 日常运维

    打开Exchange命令行管理工具 输入以下命令 PS 黄色背景标注为变量 需要根据实际情况修改 给administrator赋权 否则在下面运行Search Mailbox的时候会无法识别该命令 New ManagementRoleAss
  • 解密照片级表现技巧(一些关于UE4建筑表现的废话)

    文章转自虚幻中国论坛 Alex Tsui 各位老司机好 我是Alex 前几天分享自己的FPS项目文件的时候也说过会陆陆续续分享一些项目文件 供像我一样的菜鸟和爱好者学习交流 那么今天就分享一个个人的建筑表现作品 引擎的屏幕高清截图有BUG
  • CE寻找游戏基址

    什么是游戏基址 游戏基址是保持恒定的两部分内存地址的一部分并提供一个基准点 从这里可以计算一个字节数据的位置 基址伴随着一个加到基上的偏移值来确定信息准确的位置 绝对地址 全局基址 一级基址 二级基址 三级基址的关系 第一步 计算机内存一般
  • mysql设置两个日期格式相减的方式

    mysql设置两个日期格式相减的方式 原始数据表数据 select atime btime sec from 数据表 相减得到的并不是秒 特别需要注意 结果 mysql中计算两个Datetime类型的时间间隔 单位为秒 需要转换 1 跨天
  • 【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill)

    ROS 郭老二博文之 ROS目录 0 版本说明 Ubuntu22 04对应的ROS2的版本为Humble Hawksbill ros humble 如果不是在Ubuntu22 04中安装ROS 请参考下面Ubuntu和ROS的版本对应关系
  • 相机的内参标定(实现原理+具体操作流程+实验结果)

    这篇主要是总结梳理一下关于学习到的相机内参标定的知识 计划分为原理介绍 具体操作流程 标定实验结果三个模块 首先先简单解释下为什么要进行相机标定这个操作 我们知道生活中实际使用的相机镜头都是透镜 初中时的物理就讲过 只有通过光心的光线才是沿
  • 代理IP:跨界电商的智能数据引擎

    代理IP在跨界电商中扮演了智能数据引擎的关键角色 其应用在数据采集 市场洞察和竞争分析等方面具有重要意义 多地区数据采集 跨界电商需要了解不同地区的市场趋势 竞争情况等 以制定相应的策略 代理IP允许企业模拟不同地区的IP地址 从而获取多地
  • anaconda必须安装在c盘吗_Anaconda的安装

    什么是Anaconda 官方说法 Anaconda指的是一个开源的Python发行版本 其包含了conda Python等180多个科学包及其依赖项 通俗说法 Anaconda就是一个工具箱 能对Python等工具进行统一的管理和使用 更加
  • Spark XGBoost的一些问题

    在使用Spark版本的xgboost的时候会有一些单机版本遇不到的问题 可能对使用的人造成一些困扰 经过两周的踩坑 总结一下 希望有帮助 1 输入 预测数据的一致性 Spark版本的XGBoost处理的输入可以是RDD或者DataFrame
  • NeurIPS 2022

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt CV 微信技术交流群 快来加入NeurIPS 2022细胞图像分割竞赛 助力生命科学领域单细胞分析 丰厚奖励等你拿 比赛背景和数据 基于显微镜图像的单细
  • 简单的debug32的基本语法介绍(基于dos环境)

    1 打开文件 debug 文件名 exe 2 r 简单的输入 r时就是查看当前各项寄存器的值 并由当前的地址 存储的指令等等 并且 我们可以用 r命令来对寄存器的值进行修改 如 r ax 3 a a指令可以让我们依次对内存单元直接写入汇编语
  • SQL优化(三):SQL优化实战

    前两节基本是讲了SQL优化重要的工具大概思路 你连explain都看不明白 遇到慢查询一个SQL执行半天的情况 估计优化起来肯定无处着手 这节主要是SQL优化的具体实战 常见的一些问题 本文实际上也收到很多别的文章影响 收集了一些大牛的优化
  • TortoiseGit disconnected no supported authentication

    今天 我发现一个从远程服务器上获取到的工程 用Git没问题 而TortoiseGit报错 Disconnected No supported authentication methods available server sent publ
  • RFID门禁系统快速识别车辆管理

    01 社会背景 随着生活水平的不断提高 汽车开始大量进入家庭 在中国城市汽车的保有量迅速增加情况下 车辆的管理已成为一个难题 对车辆进行有效的管理 其核心问题是如何对车辆进行识别 本文介绍了一个基于射频识别技术的门禁管理系统 将RFID技术
  • 总结node的优缺点

    Node js采用了谷歌的v8引擎 同时提供了多个系统级的API 这样就避免了在浏览器端运行javascript代码各种的限制 而node js就是运行在服务器端的js代码 JavaScript原始运行环境 JavaScript最早在浏览器
  • python+pyqt制作的可最小化到托盘的桌面图形应用代码实例

    本篇文章主要讲解使用python pyqt制作的可以最小化到托盘的桌面图形应用实例 日期 2023年6月11日 作者 任聪聪 效果演示 说明 实现桌面应用显示窗口 关闭窗口缩小到托盘 点击托盘显示窗口 邮件图标显示退出按钮 点击退出按钮即可
  • 寻路算法 --- A星寻路算法

    深度寻路算法应用场景 仅用于空旷地形 小游戏或者大游戏的某个小模块 点击地图 人物一步步试探 广度寻路算法应用场景 只适用于小地图 回合制的走格子游戏 上帝视角 在走之前已经把路都找出来了 A星寻路算法应用场景 应用场景广泛 RPG游戏 为
  • Python经典基础编程练习题(二)——每日10题

    1 编写一个程序 输入若干个单词 并且以逗号分隔按字母顺序排序后 以逗号分隔打印单词 输入 without hello bag world 输出 bag hello without world 解题思路 掌握分词和排序函数 a input
  • 面经——嵌入式软件工程师面试遇到的经典题目

    参考 嵌入式软件工程师面试遇到的经典题目 作者 一只青木呀 发布时间 2020 11 04 23 43 16 网址 https blog csdn net weixin 45309916 article details 109499825
  • Android-Java和HTML5交互-混合开发-优化

    现在很多的 APP中会嵌套HTML5的页面 比如经常变化的等等 有一部分页面需要原生Java与HTML5中的js进行交互操作 下面介绍一下android中HTML5的使用 1 关于HTML5种cookie 网页中可能会用到 用户信息等很多参