/**
* Summary: 异步回调页面JS函数管理对象
* Version 1.0
* Date: 13-11-26
* Time: 下午7:55
* Copyright: Copyright (c) 2013
*/
package com.minggo.pluto.util;
import android.util.Log;
import android.webkit.WebView;
import java.lang.ref.WeakReference;
/**
* JS回调
* @author minggo
* @time 2015-5-8上午10:50:59
*/
public class JsCallback {
private static final String CALLBACK_JS_FORMAT = "javascript:%s.callback(%d, %d %s);";
private int mIndex;
private boolean mCouldGoOn;
private WeakReference<WebView> mWebViewRef;
private int mIsPermanent;
private String mInjectedName;
public JsCallback (WebView view, String injectedName, int index) {
mCouldGoOn = true;
mWebViewRef = new WeakReference<WebView>(view);
mInjectedName = injectedName;
mIndex = index;
}
public void apply (Object... args) throws JsCallbackException {
if (mWebViewRef.get() == null) {
throw new JsCallbackException("the WebView related to the JsCallback has been recycled");
}
if (!mCouldGoOn) {
throw new JsCallbackException("the JsCallback isn't permanent,cannot be called more than once");
}
StringBuilder sb = new StringBuilder();
for (Object arg : args){
sb.append(",");
boolean isStrArg = arg instanceof String;
if (isStrArg) {
sb.append("\"");
}
sb.append(String.valueOf(arg));
if (isStrArg) {
sb.append("\"");
}
}
String execJs = String.format(CALLBACK_JS_FORMAT, mInjectedName, mIndex, mIsPermanent, sb.toString());
Log.d("JsCallBack", execJs);
mWebViewRef.get().loadUrl(execJs);
mCouldGoOn = mIsPermanent > 0;
}
public void setPermanent (boolean value) {
mIsPermanent = value ? 1 : 0;
}
public static class JsCallbackException extends Exception {
public JsCallbackException (String msg) {
super(msg);
}
}
}