/** * 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); } } }