WebView 没有加载网页

Posted

技术标签:

【中文标题】WebView 没有加载网页【英文标题】:WebView is not loading webpage 【发布时间】: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 【参考方案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));

【讨论】:

以上是关于WebView 没有加载网页的主要内容,如果未能解决你的问题,请参考以下文章

android webview 加载url有延迟怎么办,有没有比wenview更好的第三方控件

webview获取网页点击事件

Android WebView 加载网页 样式错误

怎样使用webview打开每个网页

有没有办法在android上有一个webview,我可以在页面加载之前注入css?

android中webview 怎么实现网页加载时显示加载进度