【问题标题】:WebView is not loading webpageWebView 没有加载网页
【发布时间】:2017-07-03 15:30:13
【问题描述】:

我正在使用WebView 加载网站。但是它非常慢并且在加载特定网站时会泄漏。 我正在使用以下代码加载WebView

@Override
    protected void onNewIntent(Intent intent) {
        if (intent.getStringExtra("url") != null) {
            webView.loadurl(intent.getStringExtra("url"));

            }
    }

但我在用以下方法初始化WebView 后,在onCreate() 方法中调用webView.loadUrl(Config.URL);Config.URL 可能包含与上面指定的相同的url)。

        this.webView = (WebView) findViewById(R.id.wv);
        this.webView.getSettings().setJavaScriptEnabled(true);
        this.webView.getSettings().setLoadsImagesAutomatically(true);
        this.webView.getSettings().setDomStorageEnabled(true);
        this.webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        MyClient client = new MyClient(WebActivity.this, (ProgressBar)findViewById(R.id.progressBar));
        webView.setWebViewClient(client);

onCreate() 加载工作正常(不好,太慢了)。但 从onNewIntent() 加载的同一网址不起作用!!!。 在我在onNewIntent() 中执行此操作后,没有使用加载任何 URL webView.loadurl() 并且当前页面变得无法移动。 IE。这 滚动条在WebView 中移动,但页面没有滚动。我测试过 onCreate() 中的相同 URL 并且它正在工作。

为此,我使用

传递 url
intent.putExtra("url", Config.URL+targetUrl);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

通知中的待处理意图。尽管它可以在某些设备上运行,例如 Google Nexus。但它不适用于大多数手机。 我有

android:hardwareAccelerated="true"

我的客户

public class MyClient extends WebViewClient{
    private Context context;
    private Activity activity;
    private Handler handler;
    private Runnable runnable;
    private ProgressBar viewBar;
    private String ret,ret2;
    public void setFirstLoad(boolean firstLoad) {
        this.firstLoad = firstLoad;
    }

    private boolean firstLoad=false;
    public MyClient(Activity activity, ProgressBar bar) {
        this.context = activity.getApplicationContext();
        this.activity = activity;
        viewBar=bar;
        handler=new Handler();
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        /*if (url.startsWith("tel:")) {
            Intent intent = new Intent(Intent.ACTION_DIAL,
                    Uri.parse(url));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }else if(url.startsWith("http:") || url.startsWith("https:")) {
            *//*view.setVisibility(View.GONE);
            viewBar.setVisibility(View.VISIBLE);*//*
            view.loadUrl(url);
        }
        return true;*/
        if (Uri.parse(url).getHost().equals("www.somepage.com")) {
            return false;
        }
        // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs
        try {
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
            Answers.getInstance().logShare(new ShareEvent()
            .putContentId(Build.USER)
            .putMethod(shareName(url))
            .putContentName(contentDecode(url))
            .putContentType("news_share"));
        }catch (android.content.ActivityNotFoundException e){
            Log.e("Activity not found",e.toString());
            Toast.makeText(context,"Application not found",Toast.LENGTH_LONG).show();
        }

        return true;

    }

    @Override
    public void onReceivedError(final WebView view, int errorCode, String description, final String failingUrl) {
        //Clearing the WebView
        try {
            view.stopLoading();
        } catch (Exception e) {
        }
        try {
            view.clearView();
        } catch (Exception e) {
        }
        if (view.canGoBack()) {
            view.goBack();
        }
        view.loadUrl("about:blank");

        //Showing and creating an alet dialog
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(activity);
        alertDialog.setTitle("Error");
        alertDialog.setMessage("No internet connection was found!");
        alertDialog.setPositiveButton("Retry", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                view.loadUrl(failingUrl);

            }
        });
        AlertDialog alert = alertDialog.create();
        alert.show();

        //Don't forget to call supper!
        super.onReceivedError(view, errorCode, description, failingUrl);
    }

    @Override
    public void onLoadResource(final WebView view, String url) {
        super.onLoadResource(view, url);
        //injectScriptFile(view, "js/script.js");
        injectCSS(view,"css/style.css");
        if (firstLoad){
            firstLoad=false;
            view.setVisibility(View.INVISIBLE);
            viewBar.setVisibility(View.VISIBLE);
            runnable=new Runnable() {
                @Override
                public void run() {
                    viewBar.setVisibility(View.GONE);
                    view.setVisibility(View.VISIBLE);
                }
            };
            handler.postDelayed(runnable,2000);
        }

        // test if the script was loaded
       // view.loadUrl("javascript:setTimeout(hideMe(), 200)");
    }

    /*@Override
    public void onPageFinished(final WebView view, String url) {

        //System.gc();
    }*/


    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        System.gc();
    }

问题是:onNewIntent()中使用loadurl()方法有什么问题?

【问题讨论】:

  • 对不起,先生,您是否在 intent.getStringExtra("url") 中找到了想要的结果?另外,LogCat 是否有奇怪的消息?谢谢。
  • @statosdotcom 是的,我有意找到它。在 Logcat 中显示网页正在加载但不是 display.ie。页面与以前没有变化
  • 如果您正在使用 OnPause 方法,请包括它,因为它在 OnNewIntent 之前被调用。你在 OnNewIntent 上也有一个断点,即你确定它被命中了吗?
  • @StevenMarkFord 我没有使用任何onPause 方法。不幸的是,我对OnNewIntent 很感兴趣。我之前也问过question。 :) 我一直在等待有人来回应。无论如何谢谢..
  • @CoDFather 暂时注释掉“shouldOverrideUrlLoading”,然后重试看看是否有效。我认为这弄乱了 OnNewIntent

标签: android performance android-layout android-fragments webview


【解决方案1】:

从你加载 webview 的地方试试这个

   web.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }
    });

【讨论】:

    【解决方案2】:

    您可以使用 webclient 来处理 webview。在这里,我包括加载的 javascript。

             String aboutURL="YOUR URL";
    
            final ProgressDialog pd = ProgressDialog.show(, "", "Please wait", true);
    
            WebSettings settings=Webview.getSettings();
    
            settings.setJavaScriptEnabled(true);
            settings.setAppCacheEnabled(true);
            settings.setDomStorageEnabled(true);
            settings.setLoadsImagesAutomatically(true);
            settings.setDatabaseEnabled(true);
            settings.setRenderPriority(WebSettings.RenderPriority.HIGH);
            settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
            settings.setSupportZoom(true);
            settings.setBuiltInZoomControls(true);
    
            Webview.setWebViewClient(new WebViewClient() {
                public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                    Toast.makeText(activity, description, Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon)
                {
                    pd.show();
                }
                @Override
                public void onPageFinished(WebView view, String url) {
                    pd.dismiss();
                }
            });
            Webview.loadUrl(aboutURL);
    

    这里加载是基于网络处理的

    【讨论】:

      【解决方案3】:

      使用 Handler 如下发布延迟操作将解决此问题,但我不知道为什么。

      new Handler().post(webView.loadurl(url));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多