【问题标题】:AsyncTask load an local file in WebViewAsyncTask 在 WebView 中加载本地文件
【发布时间】:2017-01-07 16:14:45
【问题描述】:

在版主将此问题标记为重复之前,我已经阅读了堆栈中的所有相关问题,并且没有关于该问题的任何报告!

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

    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(),我总是得到错误“Method loadUrl must be called from the UI or UI thread, current inferred thread is worker”,但如果我正在使用此进程的 AsyncTask 将在另一个线程上完成,并且不加载 UIThread(它使应用程序变慢)。

我知道任何改变视图的东西都必须是onPostExecute()onPreExecute(),但不会是webNISR.loadUrl() 会减慢 Activity 的加载速度吗?

我需要“包含”WebView 渲染,这样我才能获得性能提升或只是设法加载页面。

值得一提的是,每个activity大约有7个WebView,所以需要工作加载页面。

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

我不再知道该怎么做,我已经进入这场战斗的日子:/

欢迎提出任何问题!

谢谢!

【问题讨论】:

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


    【解决方案1】:

    webView.loadUrl() 是异步的:它立即返回并且 WebView 继续在它自己的线程中工作。所以你不需要AsyncTask。我怀疑保留 AsyncTask 是否会显着提升性能。

    您可以使用setWebViewClientWebViewClient 设置为WebView 并覆盖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);
        }
    });
    

    【讨论】:

    • 我已经尝试过这种方法,无论是否相同,页面都以同样的方式保持不稳定,我尝试制作一个控制器以在所有内容加载后让每个人都可见,但由于某种原因无法访问onPageFinished() 方法中包含变量的值。如果你愿意,我会编辑问题并添加我已经用这种方法尝试过的内容。
    猜你喜欢
    • 2014-01-19
    • 2014-02-28
    • 2014-06-15
    • 2015-01-16
    • 2013-10-05
    • 2014-07-04
    • 1970-01-01
    • 2022-06-25
    • 2017-04-09
    相关资源
    最近更新 更多