Tencent / VasSonic

VasSonic is a lightweight and high-performance Hybrid framework developed by tencent VAS team, which is intended to speed up the first screen of websites working on Android and iOS platform.
Other
11.81k stars 1.61k forks source link

android jsBridge 绑定有时无效 #225

Closed 9527qingfeng closed 6 years ago

9527qingfeng commented 6 years ago

What steps will reproduce the problem? 该问题的重现步骤是什么? public class BaseWebFragment extends BaseFragment { private SonicImpl mSonicImpl; private String url = "http://47.96.180.179:1904/gameTeam/showWebViewIndex"; protected AgentWeb mAgentWeb; WebLinsener webLinsener; BridgeWebView mBridgeWebView; AVLoadingIndicatorView indicatorView; boolean isLoad = true;

public void setWebLinsener(WebLinsener webLinsener) {
    this.webLinsener = webLinsener;
}

public interface WebLinsener {
    void onLoadEndPage();

    void onWebStart();

    void onLoadTitle(String title);
}

public void setmAgentWeb(AgentWeb mAgentWeb) {
    this.mAgentWeb = mAgentWeb;
}

public void loadUrl(String url) {
    this.url = url;
    mAgentWeb.getWebCreator().getWebView().loadUrl(url);
    isLoad = true;
    indicatorView.show();
}

public boolean goBack() {
    return mAgentWeb.back();
}

@Override
protected void bindEvenListener() {
    super.bindEvenListener();
    url = "这是url";
    mBridgeWebView = new BridgeWebView(viewDelegate.viewHolder.root.getContext());//getActivity());
    indicatorView = new AVLoadingIndicatorView(viewDelegate.viewHolder.root.getContext());//尾部加载中状态
    indicatorView.setIndicator(new LineSpinFadeLoaderIndicator());
    indicatorView.setIndicatorColor(CommonUtils.getColor(R.color.color_font4));
    //AgentWebConfig.syncCookie(url, "token=" + "44cf54dbdcbeb90c2e448655a2e54f5c");
    // 1. 首先创建SonicImpl
    mSonicImpl = new SonicImpl(url, this.getContext());
    // 2. 调用 onCreateSession
    mSonicImpl.onCreateSession();
    //3. 创建AgentWeb ,注意创建AgentWeb的时候应该使用加入SonicWebViewClient中间件
    //        super.onViewCreated(view, savedInstanceState); // 创建 AgentWeb 注意的 go("") 传入的 mUrl 应该null 或者""
    //viewDelegate.viewHolder.mBridgeWebView = new BridgeWebView(getActivity());

    BridgeWebViewClient myWebViewClient = new BridgeWebViewClient(mBridgeWebView) {
        @Override
        public void onPageFinished(WebView view, String url) {
            view.getSettings().setJavaScriptEnabled(true);
            super.onPageFinished(view, url);
            Log.i("chen", "加载完成-----" + url);
            view.getSettings().setBlockNetworkImage(false);
            addImageClickListener(mBridgeWebView);

//这里 jsBridge !!!!! webLinsener.onLoadEndPage(); } };

    if (mAgentWeb == null) {
        mAgentWeb = AgentWeb.with(this)//
                .setAgentWebParent((ViewGroup) viewDelegate.viewHolder.rootView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))//
                .closeIndicator()
                //.setAgentWebWebSettings(getSettings())//
                .setWebViewClient(myWebViewClient)
                .setWebChromeClient(mWebChromeClient)
                .setWebView(mBridgeWebView)
                .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
                .useMiddlewareWebClient(getMiddlewareWebClient()) //设置WebViewClient中间件,支持多个WebViewClient, AgentWeb 3.0.0 加入。
                .createAgentWeb()//
                .ready()//
                .go(url);
    }

    WebView webView = mAgentWeb.getWebCreator().getWebView();
    WebSettings webSettings = webView.getSettings();
    webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

    ViewGroup.LayoutParams layoutParams2 = webView.getLayoutParams();
    layoutParams2.width = ViewGroup.LayoutParams.MATCH_PARENT;
    layoutParams2.height = ViewGroup.LayoutParams.MATCH_PARENT;
    webView.setLayoutParams(layoutParams2);

    viewDelegate.viewHolder.root.addView(indicatorView);

    FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) indicatorView.getLayoutParams();
    layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
    layoutParams.height = (int) CommonUtils.getDimensionPixelSize(R.dimen.trans_80px);
    layoutParams.width = (int) CommonUtils.getDimensionPixelSize(R.dimen.trans_80px);
    layoutParams.topMargin = AndroidUtil.getScreenW(getActivity(), true) / 2 - (int) CommonUtils.getDimensionPixelSize(R.dimen.trans_180px);
    indicatorView.setLayoutParams(layoutParams);
    //4. 注入 JavaScriptInterface
    mAgentWeb.getJsInterfaceHolder().addJavaObject("sonic",
            new SonicJavaScriptInterface(mSonicImpl.getSonicSessionClient(),
                    new Intent()
                            .putExtra(PARAM_CLICK_TIME, getArguments().getLong(PARAM_CLICK_TIME))
                            .putExtra("loadUrlTime", System.currentTimeMillis())));
    //5. 最后绑定AgentWeb

    mSonicImpl.bindAgentWeb(mAgentWeb);
    ViewGroup.LayoutParams layoutParams1 = mBridgeWebView.getLayoutParams();
    layoutParams1.width = ViewGroup.LayoutParams.MATCH_PARENT;
    layoutParams1.height = ViewGroup.LayoutParams.MATCH_PARENT;
    mBridgeWebView.setLayoutParams(layoutParams1);
    isLoad = true;
    indicatorView.show();
    if (webLinsener != null) {
        webLinsener.onWebStart();
    }
}

public AgentWeb getmAgentWeb() {
    return mAgentWeb;
}

public BridgeWebView getmBridgeWebView() {
    //外部获取 绑定交互事件
    return mBridgeWebView;
}

public static BaseWebFragment newInstance(
        String url) {
    BaseWebFragment newFragment = new BaseWebFragment();
    Bundle bundle = new Bundle();
    bundle.putString("url", url);
    newFragment.setArguments(bundle);
    return newFragment;
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    //销毁SonicSession
    mAgentWeb.getWebLifeCycle().onDestroy();
    if (mSonicImpl != null) {
        mSonicImpl.destrory();
    }
}

//在步骤3的时候应该传入给AgentWeb
public MiddlewareWebClientBase getMiddlewareWebClient() {
    return mSonicImpl.createSonicClientMiddleWare();
}

@Override
public void onResume() {
    if (mAgentWeb != null) {
        mAgentWeb.getWebLifeCycle().onResume();//恢复
    }
    super.onResume();
}

@Override
public void onPause() {
    if (mAgentWeb != null) {
        mAgentWeb.getWebLifeCycle().onPause(); //暂停应用内所有WebView , 调用mWebView.resumeTimers();/mAgentWeb.getWebLifeCycle().onResume(); 恢复。
    }
    super.onPause();
}

private void addImageClickListener(WebView webView) {
    //获取页面上所有图片地址
    webView.loadUrl("javascript:(function(){ " +
            "var objs = document.getElementsByTagName(\"img\");"
            + " var array=new Array(); "
            + " for(var j=0;j<objs.length;j++){ "
            + "array[j]=objs[j].getAttribute(\"data-src\");"
            + " }  "
            + "window.imagelistener.openImage(array);   })()");
}

protected WebChromeClient mWebChromeClient = new WebChromeClient() {
    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        //  super.onProgressChanged(view, newProgress);
        Log.i("BaseWebFragment", "onProgressChanged:" + newProgress + "  view:" + view);
        if (newProgress == 100) {
            if (webLinsener != null) {
                if (isLoad) {
                    isLoad = false;

                }
            }
            indicatorView.hide();
        } else {
            isLoad = true;
        }
    }

    @Override
    public void onReceivedTitle(WebView view, String title) {
        super.onReceivedTitle(view, title);
        if (webLinsener != null) {
            webLinsener.onLoadTitle(title);
            addImageClickListener(view);
        }
    }

};

@Override
protected Class getDelegateClass() {
    return BaseWebViewDelegate.class;
}

}

What is the expected output? What do you see instead? 你期待的结果是什么?实际看到的又是什么?

What version of the product are you using? On what operating system? 你正在使用产品的哪个版本?在什么操作系统上?

Please provide any additional information below. 如果有的话,请在下面提供更多信息。