AsyncTask没有进展到onPostExecute()

时间:2012-08-17 12:42:46

标签: android android-asynctask android-webview jsoup

我正在使用AsyncTaskdiv中加载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) {

            }
        }
    }
}

2 个答案:

答案 0 :(得分:6)

实际上,您的AsyncTask类实现是错误的。

您的代码中存在许多错误,

  1. 您正尝试在doInBackground()中访问Android中不允许的UI(WebView)。因为doInBackground在工作线程中运行,而您的活动Ui(WebView)在MainUI线程中。

  2. onPostExecute()的参数与doInBackground()的返回类型不匹配。

  3. 请通过Android开发者的AsyncTask课程获取并了解其工作原理的基本原理..

答案 1 :(得分:0)

从我在代码中看到的内容中,您已在ProgressDialog内创建了AsyncTask。如果您查看documentation of AsyncTask,则可以看到您应该只通过onPostExecute方法处理UI元素,这也适用于WebView

我建议您在onCreate方法之外定义变量后,在onCreate方法中获取对UI元素的引用,以便其他方法也可以访问它们。此外,您应该在ProgressDalog方法中执行AsyncTask之前定义并实例化onCreate。然后在onPostExecute方法中关闭对话框。