Skip to content

Commit

Permalink
bug fix and remove file of webviewjavascript.js
Browse files Browse the repository at this point in the history
  • Loading branch information
smallBuild committed Feb 29, 2020
1 parent a4f66e5 commit c8f754a
Show file tree
Hide file tree
Showing 17 changed files with 258 additions and 40 deletions.
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,11 @@ lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
app/src/main/java/com/smallbuer/jsbridge/.DS_Store
app/src/main/java/com/.DS_Store
app/src/main/java/com/smallbuer/jsbridge/demo/.DS_Store
app/src/main/java/com/smallbuer/jsbridge/demo/.DS_Store
gradle/wrapper/gradle-wrapper.jar
gradle/wrapper/gradle-wrapper.properties
app/src/main/java/com/smallbuer/jsbridge/demo/.DS_Store
app/src/main/java/com/smallbuer/jsbridge/demo/.DS_Store
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#### 版本更新说明

v1.0.0

1.重构JS桥代码以及引入BridgeTiny对象管理;
2.支持X5内核的简单使用;
3.简化项目集成难度;

v1.0.1

1.修改JS注入方式,弃用assets文件读取,直接以字符串引入;
2.修复1.0.0版本中WebViewJavascriptBridge.js以js脚本引入路径错误不生效问题,
修改为直接使用webview.loadurl(javascript:str)方式插入H5中;





11 changes: 9 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#### JSBridge-Android



### 简介

本项目来源于 lzyzsd的[JsBridge](https://github.com/lzyzsd/JsBridge),由于作者长时间未修复部分代码丢失问题,所以目前存在的调用丢失问题以及效率问题无法在原项目得到回应,所以重构了目前js文件以及java类;
Expand All @@ -16,6 +18,7 @@

如果只想解决lzyzsd的[JsBridge]项目调用桥丢失问题,可以参考files目录下的README,将JS文件替换即可;

jscript文件下的js文件为新版本SDK内部字符串压缩前的原文件;

### 导入SDK

Expand All @@ -30,10 +33,14 @@ repositories {
```
dependencies {
implementation 'com.smallbuer:jsbridge:1.0.0'
implementation 'com.smallbuer:jsbridge:1.0.1'
}
```

注:内部需要借助于GSON库,使用外部依赖;



### 使用步骤

1.新增原生功能module
Expand Down Expand Up @@ -108,7 +115,7 @@ bridgeWebview.callHandler("functionInJs", "我是原生传递的参数") { data
(1)新建X5WebView继承X5包内的webview并实现IWebView接口<br>
(2)在X5WebView中新建BridgeTiny并传入X5WebView对应,BridgeTiny作为一个webview的管理类;<br>
(3)在webview执行onPageFinished时,加载js文件内容用于执行对象的注册;<br>
(3)在webview执行onPageFinished时,加载js脚本内容用于执行对象的注册;<br>
(4)在webview执行destroy时清空使用内存;<br>

使用API如下:<br>
Expand Down
13 changes: 11 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}


buildTypes {
release {
minifyEnabled false
Expand All @@ -28,8 +35,10 @@ dependencies {

implementation project(':jsbridge')

//implementation 'com.smallbuer:jsbridge:1.0.0'

//implementation 'com.smallbuer:jsbridge:1.0.1'
implementation 'com.github.tbruyelle:rxpermissions:0.10.2'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.1'
implementation 'com.google.code.gson:gson:2.8.5'
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.smallbuer.jsbridge.demo">

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<application
android:name="com.smallbuer.jsbridge.demo.App"
android:allowBackup="true"
Expand Down
132 changes: 132 additions & 0 deletions app/src/main/assets/jsbridge/demo.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
<!-- <script type="text/javascript" src="WebViewJavascriptBridge.js"></script>-->
<title>
js调用java
</title>
</head>

<body>
<p id="show">

</p>
<p id="init">

</p>
<p>
<input type="text" id="text1" value="username"/>
</p>
<p>
<input type="text" id="text2" value="password"/>
</p>
<p>
<input type="button" id="enter" value="调用Native方法(请求)" onclick="testClick();"
/>
</p>
<p>
<input type="button" id="enter1" value="调用Native方法(Toast)" onclick="testClick1();"
/>
</p>
<p>
<input type="button" id="enter3" value="调用Native方法(高并发测试)" onclick="testClick2();"
/>
</p>
</body>
<script>

function testClick() {
var str1 = document.getElementById("text1").value;
var str2 = document.getElementById("text2").value;

var data = {url: 'www.baidu.com', userName: str1, passwd: str2};
window.WebViewJavascriptBridge.callHandler('request',
data
, function(responseData) {

console.log('native return->'+responseData);
}
);
}

function testClick1() {
var str1 = document.getElementById("text1").value;
var str2 = document.getElementById("text2").value;
//call native method
window.WebViewJavascriptBridge.callHandler(
'toast'
, {'msg': '中文测试'}
, function(responseData) {
console.log('native return->'+responseData);
}
);
}

function testClick2() {


var str1 = document.getElementById("text1").value;
var str2 = document.getElementById("text2").value;
var i = 0;
var first = setInterval(function(){
//call native method
window.WebViewJavascriptBridge.callHandler(
'toast'
, {'msg': '中文测试'}
, function(responseData) {
console.log('return->['+ i++ +']'+responseData);
}
);

if(i>500){
clearInterval(first);
}
}, 10);

}


function bridgeLog(logContent) {
document.getElementById("show").innerHTML = logContent;
}

function connectWebViewJavascriptBridge(callback) {
if (window.WebViewJavascriptBridge) {
callback(WebViewJavascriptBridge);
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady'
, function() {
callback(WebViewJavascriptBridge)
},
false
);
}
}

connectWebViewJavascriptBridge(function(bridge) {
bridge.init(function(message, responseCallback) {
console.log('JS got a message', message);
var data = {
'Javascript Responds': '测试中文!'
};

if (responseCallback) {
console.log('JS responding with', data);
responseCallback(data);
}
});

bridge.registerHandler("functionInJs", function(data, responseCallback) {
document.getElementById("show").innerHTML = ("data from Java: = " + data);
if (responseCallback) {
var responseData = "Javascript Says Right back aka!";
responseCallback(responseData);
}
});
})

</script>

</html>

2 changes: 2 additions & 0 deletions app/src/main/java/com/smallbuer/jsbridge/demo/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ class App :Application(){
override fun onCreate() {
super.onCreate()

Bridge.INSTANCE.openLog()

initX5()

initJsBridgeHandler()
Expand Down
37 changes: 32 additions & 5 deletions app/src/main/java/com/smallbuer/jsbridge/demo/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,24 +1,51 @@
package com.smallbuer.jsbridge.demo

import android.Manifest
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.tbruyelle.rxpermissions2.RxPermissions
import kotlinx.android.synthetic.main.activity_main.*


class MainActivity : AppCompatActivity() {

private val TAG = "MainActivity"

val url = "file:///android_asset/" + "demo.html"
//private val url = "file:///android_asset/" + "demo.html"

private val url = "file:///android_asset/jsbridge/" + "demo.html"

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//X5自定义webview
initX5WebView()
//自带BridgeWebview
initBridgeWebView()

RxPermissions(this).request(Manifest.permission.READ_PHONE_STATE,Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe ({ granted ->
if (granted) {

initX5WebView()

initUcWebView()

initBridgeWebView()

} else {

}
},{ finish() })

}



/**
* Usage example for UC webview
*/
private fun initUcWebView() {



}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ public void handler(Context context,String data, CallBackFunction function) {

BridgeLog.d(TAG,"data->"+data);

//进行网络请求.....
//回调
//a network request .....
//callback
function.onCallBack("{\"status\":\"0\",\"msg\":\"请求成功\"}");

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public void handler(Context context,String data, CallBackFunction function) {

Toast.makeText(context,"data:"+data,Toast.LENGTH_SHORT).show();

function.onCallBack("{\"status\":\"0\",\"msg\":\"吐司成功\"}");
function.onCallBack("{\"status\":\"0\",\"msg\":\"toast success\"}");

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import android.content.Context;
import android.util.AttributeSet;

import androidx.annotation.Nullable;

import com.smallbuer.jsbridge.core.BridgeTiny;
import com.smallbuer.jsbridge.core.BridgeUtil;
import com.smallbuer.jsbridge.core.IWebView;
Expand Down Expand Up @@ -54,7 +56,7 @@ private void initWebViewSettings() {

private WebViewClient client = new WebViewClient() {
/**
* 防止加载网页时调起系统浏览器
* prevent system browser from launching when web page loads
*/
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
Expand All @@ -64,10 +66,9 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
@Override
public void onPageFinished(WebView webView, String s) {
super.onPageFinished(webView, s);
bridgeTiny.webViewLoadJs((IWebView) webView,BridgeUtil.JAVA_SCRIPT);
bridgeTiny.webViewLoadJs((IWebView) webView);
}


};

@Override
Expand All @@ -77,12 +78,14 @@ public void destroy() {
}

@Override
public void evaluateJavascript(String var1, Object object) {
public void evaluateJavascript(String var1,@Nullable Object object) {
if(object == null){
super.evaluateJavascript(var1, null);
return;
}
super.evaluateJavascript(var1, (ValueCallback<String>) object);
}



@Override
public void callHandler(String handlerName, Object data, OnBridgeCallback responseCallback) {
bridgeTiny.callHandler(handlerName,data,responseCallback);
Expand Down
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ buildscript {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
//maven {url 'https://dl.bintray.com/smallbuer/tools/' }


Expand All @@ -22,6 +23,7 @@ allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
//maven {url 'https://dl.bintray.com/smallbuer/tools/' }

}
Expand Down
Loading

0 comments on commit c8f754a

Please sign in to comment.