WebView无法加载网页

15

我正在使用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()中加载相同的URL时不起作用!在我使用onNewIntent()后,没有任何URL通过webView.loadurl()加载,当前页面无法移动。也就是说,在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()方法时出现了什么问题?

@statosdotcom 是的,我在意图中找到了它。在Logcat中显示网页正在加载,但不显示。即页面未从先前更改。 - Kiran Benny Joseph
如果您正在使用OnPause方法,请将其包含在内,因为它会在OnNewIntent之前被调用。另外,您是否在OnNewIntent上设置了断点?也就是说,您确定它被触发了吗? - Steven Mark Ford
@StevenMarkFord 我没有使用任何 onPause 方法。不幸的是,我在 OnNewIntent 上遇到了问题。我之前也曾经提出过一个问题。:) 我一直在等待有人来回答。无论如何,谢谢。 - Kiran Benny Joseph
@CoDFather 临时注释掉 "shouldOverrideUrlLoading",然后重试看看是否有效。我认为它正在干扰 OnNewIntent。 - Steven Mark Ford
@CoDFather,尝试回归基础,然后逐步重新添加内容以确定问题所在。注释掉onLoadResource并重试。最坏的情况下,您也可以创建一个新的Webview而不是使用旧的。 - Steven Mark Ford
显示剩余3条评论
3个回答

6

在加载webview的位置尝试一下这个方法

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

1
你可以使用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);

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

0
使用Handler来发布延迟操作,如下所示,可以解决这个问题,但我不知道为什么。
new Handler().post(webView.loadurl(url));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接