AsyncTask在WebView中加载本地文件

时间:2017-01-07 16:14:46

标签: android android-studio android-asynctask android-webview

在主持人将此问题标记为重复之前,我已经阅读了堆栈中的所有相关问题,并且无法报告此问题!

我在尝试使用WebView的AsyncTask时遇到问题,请按照代码进行操作

    final WebView webNISR = (WebView) findViewById(R.id.web_NISR);
        final WebSettings webS_NISR = webNISR.getSettings();
        AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
            @Override
            protected void onPreExecute(){
                webNISR.setVisibility(View.GONE);
                // I left webNISR.loadUrl here for test, but it keeps processing slow, nothing changes!
                webNISR.loadUrl(getString(R.string.waytofile)+"file.html");
            }
            @Override
            protected Void doInBackground(Void... params) {
                webS_NISR.setJavaScriptEnabled(true);
                webS_NISR.setDomStorageEnabled(true);
              //webNISR.loadUrl(params);
                return null;
            }
            @Override
            protected void onPostExecute(Void result){
                webNISR.setVisibility(View.VISIBLE);
            }
        };

doInBackground()只需进行处理,好吧!

但是我不能在里面使用webNISR.loadUrl(),我总是得到错误&#34; 方法必须从UI或UI线程调用loadUrl,当前推断的线程是worker &# 34;,但如果我在另一个线程上使用AsyncTask进行此过程并且不加载UIThread(它会使App慢速运行)。

我了解更改视图的任何内容都必须是onPostExecute()onPreExecute(),但是webNISR.loadUrl()会不会减慢活动的加载速度?

我需要将WebView呈现为&#34;包含&#34;这样我可以获得性能提升或只是设法加载页面。

值得一提的是,每个活动大约有7个WebView,因此需要加载页面。

注意: WebView是不可替代的(只有他们可以加载这些本地文件)

我不知道该怎么做,我在这场战斗中度过了几天:/

欢迎任何问题!

谢谢!

1 个答案:

答案 0 :(得分:0)

webView.loadUrl()是异步的:它立即返回,WebView继续在它自己的线程中工作。所以你不需要AsyncTask。我怀疑保持AsyncTask是否会增加任何显着的性能增益。

您可以使用WebViewClientWebView设置为setWebViewClient并覆盖onPageFinished方法。 当webview在onPageFinished回调中加载完成后,执行您的操作。

final WebView webNISR = (WebView) findViewById(R.id.web_NISR);
webNISR.setVisibility(View.GONE);

webNISR.getSettings().setJavaScriptEnabled(true);
webNISR.getSettings().setDomStorageEnabled(true);
webNISR.loadUrl(getString(R.string.waytofile)+"file.html");

webview.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {
        webNISR.setVisibility(View.VISIBLE);
    }
});