From 8f600de478340fdb3967a507b4b95ffd41a21744 Mon Sep 17 00:00:00 2001 From: shenme Date: Tue, 28 Aug 2018 09:46:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9Js=E5=9B=9E=E8=B0=83=E4=BC=A0?= =?UTF-8?q?=E5=80=BC=E7=B1=BB=E5=9E=8BString=E4=B8=BAObject=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E7=A7=8D=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/build.gradle | 1 - .../lzyzsd/jsbridge/example/MainActivity.java | 4 +- library/build.gradle | 29 +- .../github/lzyzsd/jsbridge/BridgeWebView.java | 366 +++++++++--------- .../lzyzsd/jsbridge/CallBackFunction.java | 2 +- .../com/github/lzyzsd/jsbridge/Message.java | 46 +-- 6 files changed, 218 insertions(+), 230 deletions(-) diff --git a/example/build.gradle b/example/build.gradle index b4742e0..49a8375 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -23,5 +23,4 @@ dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':library') compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.google.code.gson:gson:2.3.1' } diff --git a/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainActivity.java b/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainActivity.java index 6ddfe56..e7908a8 100644 --- a/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainActivity.java +++ b/example/src/main/java/com/github/lzyzsd/jsbridge/example/MainActivity.java @@ -90,7 +90,7 @@ public void handler(String data, CallBackFunction function) { webView.callHandler("functionInJs", new Gson().toJson(user), new CallBackFunction() { @Override - public void onCallBack(String data) { + public void onCallBack(Object data) { } }); @@ -123,7 +123,7 @@ public void onClick(View v) { webView.callHandler("functionInJs", "data from Java", new CallBackFunction() { @Override - public void onCallBack(String data) { + public void onCallBack(Object data) { // TODO Auto-generated method stub Log.i(TAG, "reponse data from js " + data); } diff --git a/library/build.gradle b/library/build.gradle index 0dc5ef9..3c2db1d 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -24,28 +24,11 @@ android { } } -dependencies { -} -def siteUrl = 'https://github.com/lzyzsd/JsBridge' -def gitUrl = 'https://github.com/lzyzsd/JsBridge.git' -apply plugin: 'com.github.dcendents.android-maven' -group = "com.github.lzyzsd.jsbridge" -task sourcesJar(type: Jar) { - from android.sourceSets.main.java.srcDirs - classifier = 'sources' -} -task javadoc(type: Javadoc) { - source = android.sourceSets.main.java.srcDirs - classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) -} -task javadocJar(type: Jar, dependsOn: javadoc) { - classifier = 'javadoc' - from javadoc.destinationDir -} -artifacts { - archives javadocJar - archives sourcesJar +dependencies { + compile fileTree(include: ['*.jar'], dir: 'libs') + compile 'com.google.code.gson:gson:2.8.0' } -Properties properties = new Properties() -properties.load(project.rootProject.file('local.properties').newDataInputStream()) +repositories { + mavenCentral() +} \ No newline at end of file diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java b/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java index b24db85..8f024bc 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/BridgeWebView.java @@ -9,6 +9,8 @@ import android.util.AttributeSet; import android.webkit.WebView; +import com.google.gson.Gson; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -17,59 +19,57 @@ @SuppressLint("SetJavaScriptEnabled") public class BridgeWebView extends WebView implements WebViewJavascriptBridge { - private final String TAG = "BridgeWebView"; + private final String TAG = "BridgeWebView"; - public static final String toLoadJs = "WebViewJavascriptBridge.js"; - Map responseCallbacks = new HashMap(); - Map messageHandlers = new HashMap(); - BridgeHandler defaultHandler = new DefaultHandler(); + public static final String toLoadJs = "WebViewJavascriptBridge.js"; + Map responseCallbacks = new HashMap(); + Map messageHandlers = new HashMap(); + BridgeHandler defaultHandler = new DefaultHandler(); - private List startupMessage = new ArrayList(); + private List startupMessage = new ArrayList(); - public List getStartupMessage() { - return startupMessage; - } + public List getStartupMessage() { + return startupMessage; + } - public void setStartupMessage(List startupMessage) { - this.startupMessage = startupMessage; - } + public void setStartupMessage(List startupMessage) { + this.startupMessage = startupMessage; + } - private long uniqueId = 0; + private long uniqueId = 0; - public BridgeWebView(Context context, AttributeSet attrs) { - super(context, attrs); - init(); - } + public BridgeWebView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } - public BridgeWebView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - init(); - } + public BridgeWebView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } - public BridgeWebView(Context context) { - super(context); - init(); - } + public BridgeWebView(Context context) { + super(context); + init(); + } - /** - * - * @param handler - * default handler,handle messages send by js without assigned handler name, - * if js message has handler name, it will be handled by named handlers registered by native - */ - public void setDefaultHandler(BridgeHandler handler) { - this.defaultHandler = handler; - } + /** + * @param handler default handler,handle messages send by js without assigned handler name, + * if js message has handler name, it will be handled by named handlers registered by native + */ + public void setDefaultHandler(BridgeHandler handler) { + this.defaultHandler = handler; + } private void init() { - this.setVerticalScrollBarEnabled(false); - this.setHorizontalScrollBarEnabled(false); - this.getSettings().setJavaScriptEnabled(true); + this.setVerticalScrollBarEnabled(false); + this.setHorizontalScrollBarEnabled(false); + this.getSettings().setJavaScriptEnabled(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { WebView.setWebContentsDebuggingEnabled(true); } - this.setWebViewClient(generateBridgeWebViewClient()); - } + this.setWebViewClient(generateBridgeWebViewClient()); + } protected BridgeWebViewClient generateBridgeWebViewClient() { return new BridgeWebViewClient(this); @@ -77,73 +77,77 @@ protected BridgeWebViewClient generateBridgeWebViewClient() { /** * 获取到CallBackFunction data执行调用并且从数据集移除 + * * @param url */ - void handlerReturnData(String url) { - String functionName = BridgeUtil.getFunctionFromReturnUrl(url); - CallBackFunction f = responseCallbacks.get(functionName); - String data = BridgeUtil.getDataFromReturnUrl(url); - if (f != null) { - f.onCallBack(data); - responseCallbacks.remove(functionName); - return; - } - } + void handlerReturnData(String url) { + String functionName = BridgeUtil.getFunctionFromReturnUrl(url); + CallBackFunction f = responseCallbacks.get(functionName); + String data = BridgeUtil.getDataFromReturnUrl(url); + if (f != null) { + f.onCallBack(data); + responseCallbacks.remove(functionName); + return; + } + } - @Override - public void send(String data) { - send(data, null); - } + @Override + public void send(String data) { + send(data, null); + } - @Override - public void send(String data, CallBackFunction responseCallback) { - doSend(null, data, responseCallback); - } + @Override + public void send(String data, CallBackFunction responseCallback) { + doSend(null, data, responseCallback); + } /** * 保存message到消息队列 - * @param handlerName handlerName - * @param data data + * + * @param handlerName handlerName + * @param data data * @param responseCallback CallBackFunction */ - private void doSend(String handlerName, String data, CallBackFunction responseCallback) { - Message m = new Message(); - if (!TextUtils.isEmpty(data)) { - m.setData(data); - } - if (responseCallback != null) { - String callbackStr = String.format(BridgeUtil.CALLBACK_ID_FORMAT, ++uniqueId + (BridgeUtil.UNDERLINE_STR + SystemClock.currentThreadTimeMillis())); - responseCallbacks.put(callbackStr, responseCallback); - m.setCallbackId(callbackStr); - } - if (!TextUtils.isEmpty(handlerName)) { - m.setHandlerName(handlerName); - } - queueMessage(m); - } + private void doSend(String handlerName, String data, CallBackFunction responseCallback) { + Message m = new Message(); + if (!TextUtils.isEmpty(data)) { + m.setData(data); + } + if (responseCallback != null) { + String callbackStr = String.format(BridgeUtil.CALLBACK_ID_FORMAT, ++uniqueId + (BridgeUtil.UNDERLINE_STR + SystemClock.currentThreadTimeMillis())); + responseCallbacks.put(callbackStr, responseCallback); + m.setCallbackId(callbackStr); + } + if (!TextUtils.isEmpty(handlerName)) { + m.setHandlerName(handlerName); + } + queueMessage(m); + } /** * list != null 添加到消息集合否则分发消息 + * * @param m Message */ - private void queueMessage(Message m) { - if (startupMessage != null) { - startupMessage.add(m); - } else { - dispatchMessage(m); - } - } + private void queueMessage(Message m) { + if (startupMessage != null) { + startupMessage.add(m); + } else { + dispatchMessage(m); + } + } /** * 分发message 必须在主线程才分发成功 + * * @param m Message */ - void dispatchMessage(Message m) { - String messageJson = m.toJson(); + void dispatchMessage(Message m) { + String messageJson = new Gson().toJson(m); //escape special characters for json string 为json字符串转义特殊字符 messageJson = messageJson.replaceAll("(\\\\)([^utrn])", "\\\\\\\\$1$2"); messageJson = messageJson.replaceAll("(?<=[^\\\\])(\")", "\\\\\""); - messageJson = messageJson.replaceAll("(?<=[^\\\\])(\')", "\\\\\'"); + messageJson = messageJson.replaceAll("(?<=[^\\\\])(\')", "\\\\\'"); String javascriptCommand = String.format(BridgeUtil.JS_HANDLE_MESSAGE_FROM_JAVA, messageJson); // 必须要找主线程才会将数据传递出去 --- 划重点 if (Thread.currentThread() == Looper.getMainLooper().getThread()) { @@ -154,110 +158,112 @@ void dispatchMessage(Message m) { /** * 刷新消息队列 */ - void flushMessageQueue() { - if (Thread.currentThread() == Looper.getMainLooper().getThread()) { - loadUrl(BridgeUtil.JS_FETCH_QUEUE_FROM_JAVA, new CallBackFunction() { + void flushMessageQueue() { + if (Thread.currentThread() == Looper.getMainLooper().getThread()) { + loadUrl(BridgeUtil.JS_FETCH_QUEUE_FROM_JAVA, new CallBackFunction() { - @Override - public void onCallBack(String data) { - // deserializeMessage 反序列化消息 - List list = null; - try { - list = Message.toArrayList(data); - } catch (Exception e) { + @Override + public void onCallBack(Object data) { + // deserializeMessage 反序列化消息 + List list = null; + try { + list = Message.toArrayList(String.valueOf(data)); + } catch (Exception e) { e.printStackTrace(); - return; - } - if (list == null || list.size() == 0) { - return; - } - for (int i = 0; i < list.size(); i++) { - Message m = list.get(i); - String responseId = m.getResponseId(); - // 是否是response CallBackFunction - if (!TextUtils.isEmpty(responseId)) { - CallBackFunction function = responseCallbacks.get(responseId); - String responseData = m.getResponseData(); - function.onCallBack(responseData); - responseCallbacks.remove(responseId); - } else { - CallBackFunction responseFunction = null; - // if had callbackId 如果有回调Id - final String callbackId = m.getCallbackId(); - if (!TextUtils.isEmpty(callbackId)) { - responseFunction = new CallBackFunction() { - @Override - public void onCallBack(String data) { - Message responseMsg = new Message(); - responseMsg.setResponseId(callbackId); - responseMsg.setResponseData(data); - queueMessage(responseMsg); - } - }; - } else { - responseFunction = new CallBackFunction() { - @Override - public void onCallBack(String data) { - // do nothing - } - }; - } - // BridgeHandler执行 - BridgeHandler handler; - if (!TextUtils.isEmpty(m.getHandlerName())) { - handler = messageHandlers.get(m.getHandlerName()); - } else { - handler = defaultHandler; - } - if (handler != null){ - handler.handler(m.getData(), responseFunction); - } - } - } - } - }); - } - } + return; + } + if (list == null || list.size() == 0) { + return; + } + for (int i = 0; i < list.size(); i++) { + Message m = list.get(i); + String responseId = m.getResponseId(); + // 是否是response CallBackFunction + if (!TextUtils.isEmpty(responseId)) { + CallBackFunction function = responseCallbacks.get(responseId); + Object responseData = m.getResponseData(); + function.onCallBack(responseData); + responseCallbacks.remove(responseId); + } else { + CallBackFunction responseFunction = null; + // if had callbackId 如果有回调Id + final String callbackId = m.getCallbackId(); + if (!TextUtils.isEmpty(callbackId)) { + responseFunction = new CallBackFunction() { + @Override + public void onCallBack(Object data) { + Message responseMsg = new Message(); + responseMsg.setResponseId(callbackId); + responseMsg.setResponseData(data); + queueMessage(responseMsg); + } + }; + } else { + responseFunction = new CallBackFunction() { + @Override + public void onCallBack(Object data) { + // do nothing + } + }; + } + // BridgeHandler执行 + BridgeHandler handler; + if (!TextUtils.isEmpty(m.getHandlerName())) { + handler = messageHandlers.get(m.getHandlerName()); + } else { + handler = defaultHandler; + } + if (handler != null) { + handler.handler(m.getData(), responseFunction); + } + } + } + } + }); + } + } - public void loadUrl(String jsUrl, CallBackFunction returnCallback) { - this.loadUrl(jsUrl); + public void loadUrl(String jsUrl, CallBackFunction returnCallback) { + this.loadUrl(jsUrl); // 添加至 Map - responseCallbacks.put(BridgeUtil.parseFunctionName(jsUrl), returnCallback); - } + responseCallbacks.put(BridgeUtil.parseFunctionName(jsUrl), returnCallback); + } - /** - * register handler,so that javascript can call it - * 注册处理程序,以便javascript调用它 - * @param handlerName handlerName - * @param handler BridgeHandler - */ - public void registerHandler(String handlerName, BridgeHandler handler) { - if (handler != null) { + /** + * register handler,so that javascript can call it + * 注册处理程序,以便javascript调用它 + * + * @param handlerName handlerName + * @param handler BridgeHandler + */ + public void registerHandler(String handlerName, BridgeHandler handler) { + if (handler != null) { // 添加至 Map - messageHandlers.put(handlerName, handler); - } - } - - /** - * unregister handler - * - * @param handlerName - */ - public void unregisterHandler(String handlerName) { - if (handlerName != null) { - messageHandlers.remove(handlerName); - } - } + messageHandlers.put(handlerName, handler); + } + } - /** - * call javascript registered handler - * 调用javascript处理程序注册 + /** + * unregister handler + * + * @param handlerName + */ + public void unregisterHandler(String handlerName) { + if (handlerName != null) { + messageHandlers.remove(handlerName); + } + } + + /** + * call javascript registered handler + * 调用javascript处理程序注册 + * * @param handlerName handlerName - * @param data data - * @param callBack CallBackFunction - */ - public void callHandler(String handlerName, String data, CallBackFunction callBack) { + * @param data data + * @param callBack CallBackFunction + */ + public void callHandler(String handlerName, String data, CallBackFunction callBack) { doSend(handlerName, data, callBack); - } + } } diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/CallBackFunction.java b/library/src/main/java/com/github/lzyzsd/jsbridge/CallBackFunction.java index f41df5b..41a0b6d 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/CallBackFunction.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/CallBackFunction.java @@ -2,6 +2,6 @@ public interface CallBackFunction { - public void onCallBack(String data); + public void onCallBack(Object data); } diff --git a/library/src/main/java/com/github/lzyzsd/jsbridge/Message.java b/library/src/main/java/com/github/lzyzsd/jsbridge/Message.java index 00d25db..dfa22d1 100644 --- a/library/src/main/java/com/github/lzyzsd/jsbridge/Message.java +++ b/library/src/main/java/com/github/lzyzsd/jsbridge/Message.java @@ -18,7 +18,7 @@ public class Message { private String callbackId; //callbackId private String responseId; //responseId - private String responseData; //responseData + private Object responseData; //responseData private String data; //data of message private String handlerName; //name of handler @@ -34,10 +34,10 @@ public String getResponseId() { public void setResponseId(String responseId) { this.responseId = responseId; } - public String getResponseData() { + public Object getResponseData() { return responseData; } - public void setResponseData(String responseData) { + public void setResponseData(Object responseData) { this.responseData = responseData; } public String getCallbackId() { @@ -59,26 +59,26 @@ public void setHandlerName(String handlerName) { this.handlerName = handlerName; } - public String toJson() { - JSONObject jsonObject= new JSONObject(); - try { - jsonObject.put(CALLBACK_ID_STR, getCallbackId()); - jsonObject.put(DATA_STR, getData()); - jsonObject.put(HANDLER_NAME_STR, getHandlerName()); - String data = getResponseData(); - if (TextUtils.isEmpty(data)) { - jsonObject.put(RESPONSE_DATA_STR, data); - } else { - jsonObject.put(RESPONSE_DATA_STR, new JSONTokener(data).nextValue()); - } - jsonObject.put(RESPONSE_DATA_STR, getResponseData()); - jsonObject.put(RESPONSE_ID_STR, getResponseId()); - return jsonObject.toString(); - } catch (JSONException e) { - e.printStackTrace(); - } - return null; - } +// public String toJson() { +// JSONObject jsonObject= new JSONObject(); +// try { +// jsonObject.put(CALLBACK_ID_STR, getCallbackId()); +// jsonObject.put(DATA_STR, getData()); +// jsonObject.put(HANDLER_NAME_STR, getHandlerName()); +// String data = getResponseData(); +// if (TextUtils.isEmpty(data)) { +// jsonObject.put(RESPONSE_DATA_STR, data); +// } else { +// jsonObject.put(RESPONSE_DATA_STR, new JSONTokener(data).nextValue()); +// } +// jsonObject.put(RESPONSE_DATA_STR, getResponseData()); +// jsonObject.put(RESPONSE_ID_STR, getResponseId()); +// return jsonObject.toString(); +// } catch (JSONException e) { +// e.printStackTrace(); +// } +// return null; +// } public static Message toObject(String jsonStr) { Message m = new Message();