2012-08-17 81 views
1

我使用AsyncTaskWebView中加载div,同时显示ProgressDialog。 加载内容并显示ProgressDialog,但由于执行没有输入onPostExecute(),所以不会消失。你能告诉我我做错了什么吗?AsyncTask不会进展到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) { 

      } 
     } 
    } 
} 

回答

6

其实,你AsyncTask类的实现是错的..

有很多在你的代码错误,

  1. 您在doInBackground()其中没有按试图访问UI(的WebView)在Android中不允许。由于doInBackground在工作线程中运行,而您的Activity Ui(WebView)位于MainUI线程中。

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

请走线槽从Android开发者​​类和获得基本技术的工作原理..

+0

专门使用protected void onPostExecute(String unused)not void – nandeesh 2012-08-17 12:53:28

+0

由于它不可能为您提供'AsyncTask'类的完整代码。更好地学习自己,这样你就可以了解流程和实施,这将在未来帮助你。 – user370305 2012-08-17 12:55:16

0

从我可以在你的代码中看到您所创建的AsyncTaskProgressDialog内。如果你看看documentation of AsyncTask,你可以看到你只能通过onPostExecute方法处理UI元素,这也适用于WebView

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

相关问题