2013-07-29 165 views
3

我在我的应用程序中使用AsyncTask,但是当它启动时,就像它永远不会结束。当我在调试doInBackground后,应用程序冻结并卡在ThreadPoolExecutor.runWorker(ThreadPoolExecutor$Worker)中。AsyncTask停止应用程序

这里是我的代码

class FetchSymbolInfo extends AsyncTask<String, Void, Document> { 

     private Exception exception = null; 

     @Override 
     protected Document doInBackground(String... params) 
     { 
      try 
      { 
       Document doc = null; 
       //doc = Jsoup.connect(params[0]).get();//application freezes even if I remove this line 
       return doc; 
      } 
      catch (Exception e) 
      { 
       this.exception = e; 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(Document result) 
     { 
      if(exception != null) 
     { 
      AlertDialog alertDialog; 
      alertDialog = new AlertDialog.Builder(null).create();////////// 
      alertDialog.setTitle("Error"); 
      alertDialog.setMessage("Could not fetch from internetd\nPlease check your inernet connection and symbol name."); 
      alertDialog.show(); 
      return; 
     } 

     Elements valueElement = result.select("div#qwidget_lastsale"); 
     String valueString = valueElement.toString(); 
     //getting number from string 
     } 

     @Override 
      protected void onPreExecute() { 
      } 

     @Override 
     protected void onCancelled() { 
      super.onCancelled(); 
     } 

     @Override 
     protected void onCancelled(Document result) { 
      super.onCancelled(result); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
     } 

结构,我想这样的

String url = "url"; //writing an url 
FetchSymbolInfo fetch = new FetchSymbolInfo(); 
fetch.execute(url); 

任何想法执行呢?先谢谢你!

+2

这是你的实际代码,还是只是一个骷髅?我在这里没有看到任何应该导致它挂起的东西。它只是向'onPostExecute'发送一个'null'并停止。 – Geobits

+0

这只是一个骷髅,但我正在尝试我的代码与'doInBackground'函数具有相同的主体,并且它再次冻结 – nabroyan

+0

显示代码为'@Override protected void onPostExecute(Document result) { if(例外!= null) { //打印错误 } //做一些东西 }' – wtsang02

回答

1

你试图通过提供nullContext创建AlertDialog。你需要做的是通过传递上下文的任务的构造函数,然后使用传递从Activity调用AsyncTask一个有效的上下文,与对话:

class FetchSymbolInfo extends AsyncTask<String, Void, Document> { 

private Context parent; 

// ... 

public FetchSymbolInfo(Context c){ 
    parent = c; 
} 

// ... 

if(exception != null){ 
    AlertDialog alertDialog; 
    alertDialog = new AlertDialog.Builder(parent).create(); 
    alertDialog.setTitle("Error"); 
    alertDialog.setMessage("Could not fetch from internetd\nPlease check your inernet connection and symbol name."); 
    alertDialog.show(); 
    return; 
} 

增加:虽然没有直接关系这个问题,我认为在这里提及一点很重要,如果你像在OP那样在一个新线程中设置一个断点,那么你不会触及它 - 你最好使用Log来跟踪进入/退出方法/代码块。

0

它的接缝你应该得到的NPE。

Elements valueElement = result.select("div#qwidget_lastsale"); 
+0

不好意思,说NPE是什么意思? – nabroyan

+0

@nabroyan NullPointerException – whitfin

+0

@ Zackehh9lives这是正确的我返回了'null'和'exception'为'null'并且我尝试着使用结果。并且如果我发生异常''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''设置'''''''所以在这段代码中有很多'null' – nabroyan