在主持人将此问题标记为重复之前,我已经阅读了堆栈中的所有相关问题,并且无法报告此问题!
我在尝试使用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是不可替代的(只有他们可以加载这些本地文件)
我不知道该怎么做,我在这场战斗中度过了几天:/
欢迎任何问题!
谢谢!
答案 0 :(得分:0)
webView.loadUrl()
是异步的:它立即返回,WebView继续在它自己的线程中工作。所以你不需要AsyncTask
。我怀疑保持AsyncTask
是否会增加任何显着的性能增益。
您可以使用WebViewClient
将WebView
设置为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);
}
});