我正在使用AsyncTask
在div
中加载WebView
,同时显示ProgressDialog
。
加载内容并显示ProgressDialog
,但它不会消失,因为执行不会进入onPostExecute()
。你能告诉我我做错了什么吗?
package xx.xxx.xxx;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Document;
import android.R.string;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class NewsActivity extends Activity {
private WebView wView;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_main);
new LoadNews().execute("");
}
private class LoadNews extends AsyncTask<String, Integer, String> {
private ProgressDialog Dialog = new ProgressDialog(NewsActivity.this);
@Override
protected String doInBackground(String... params) {
String url = "http://www.example.com/example";
Document doc;
try {
doc = Jsoup.connect(url).get();
Elements ele = doc.select("div#examplediv");
String html = ele.toString();
String mime = "text/html";
String encoding = "utf-8";
wView = (WebView)findViewById(R.id.wvNews);
wView.loadDataWithBaseURL(url, html, mime, encoding, null);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
protected void onPreExecute()
{
Dialog.setMessage("please wait...");
Dialog.show();
}
protected void onPostExecute(Void unused)
{
try
{
if(Dialog.isShowing())
{
Dialog.dismiss();
}
} catch(Exception e) {
}
}
}
}
答案 0 :(得分:6)
实际上,您的AsyncTask
类实现是错误的。
您的代码中存在许多错误,
您正尝试在doInBackground()
中访问Android中不允许的UI(WebView)。因为doInBackground在工作线程中运行,而您的活动Ui(WebView)在MainUI线程中。
onPostExecute()
的参数与doInBackground()
的返回类型不匹配。
请通过Android开发者的AsyncTask课程获取并了解其工作原理的基本原理..
答案 1 :(得分:0)
从我在代码中看到的内容中,您已在ProgressDialog
内创建了AsyncTask
。如果您查看documentation of AsyncTask
,则可以看到您应该只通过onPostExecute
方法处理UI元素,这也适用于WebView
。
我建议您在onCreate
方法之外定义变量后,在onCreate
方法中获取对UI元素的引用,以便其他方法也可以访问它们。此外,您应该在ProgressDalog
方法中执行AsyncTask
之前定义并实例化onCreate
。然后在onPostExecute
方法中关闭对话框。