首页 > 解决方案 > 网页在活动前显示 2 秒

问题描述

我正在从我的 android 应用程序加载一个网络应用程序。在 URL 的初始加载中,它会重定向到登录页面,登录后,它将移动到 Web 应用程序的主屏幕。但预期的行为是在登录后将其重定向到 Native Homescreeb。因此,我已经编写了通过比较 URL 在 onPageFinished 中启动新活动的意图。但它会在移动到 Activity 之前显示网页 2 秒钟。我试着在那个案子上隐藏 Webview。然后显示一个空白屏幕 2 秒并显示一个 Activity。请参阅下面的实现,如果有任何问题,请纠正我。

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            try {

                String loadingURL =request.getUrl().toString();
                view.loadUrl(request.getUrl().toString());
              } catch (Exception e) {
                

            }
            return true;
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            try{

                handler.proceed();

            }catch (Exception e){
                e.printStackTrace();
            }
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {

            if(url.contains("https://login.microsoftonline.com/"))
            {
                
                mWebview.setVisibility(View.VISIBLE);
            }
            else if(url.contains(GlobalDeclarations.BASE_URL_WEBAPP_DEV) )
            {
                progress_div.setVisibility(View.VISIBLE);

                mWebview.setVisibility(View.GONE);
            }
        }

        @Override
        public void onPageCommitVisible(WebView view, String url) {
            super.onPageCommitVisible(view, url);
            Log.d("onPageCommitVisible", "onPageCommitVisible" + url);
        }

       @Override
        public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
            
            if (mWebview.getProgress() == 100) {

                if(url.contains(GlobalDeclarations.BASE_URL_WEBAPP_DEV))
                {
                    mWebview.setVisibility(View.GONE);

                }
                else
                {
                    mWebview.setVisibility(View.VISIBLE);
                }
                progress_div.setVisibility(View.GONE);
            }
        }

        @RequiresApi(api = Build.VERSION_CODES.O)
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);

            Log.d("onPageFinished", "onPageFinished URL........ " + url );
          
            mWebview.evaluateJavascript("common.setFromApp(" + true + ")", new ValueCallback<String>() {

                @Override
                public void onReceiveValue(String value) {
                    if (value.equals("false"))
                    {
                        mWebview.setVisibility(View.GONE);
                        Intent intent = new Intent(view.getContext(), BaseActivity.class);
                        startActivity(intent);
                    }
                    else
                    {
                        mWebview.setVisibility(View.VISIBLE);
                    }
                }
            });

标签: androidandroid-webviewandroid-websettingsandroid-webview-javascript

解决方案


嗯,这就是逻辑行为,你已经请求了新的网页,然后一些网络 I/O 的东西会获取它,然后WebView会消耗返回的数据并绘制它。然后onPageFinished被调用,在其中你调用了一些额外的 JS(执行也可能增加一些额外的毫秒)

您唯一的方法是制作一些“加载视图”并在WebView可见性设置为时显示它GONE,因为此操作必须花费一些时间来连接和处理数据WebView,这很重且效率不高(与本机视图/绘图相比)

顺便提一句。使用 logcat 并将一些行放入调用的覆盖方法中,您将看到并测量加载时间

Log.i("webview_log", "methodName called at "+System.currentTimeMillis());

推荐阅读