2013-07-29 6 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

Это ваш фактический код или просто скелет? Я ничего не вижу здесь, что должно заставить его повесить. Он просто отправляет 'null' в' onPostExecute' и останавливается. – Geobits

+0

Это просто скелет, но я пытаюсь мой код с тем же телом 'функции doInBackground', как здесь написано, и она замерзает снова – nabroyan

+0

показать код для' @Override защищен недействительным onPostExecute (результат Document) { если (exception! = null) { // ошибка печати } // что-то в этом роде } ' – wtsang02

ответ

1

Вы пытаетесь создать AlertDialog, предоставляя nullContext. Что вам нужно сделать, это передать действительный контекст из 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», и я попытался работать с результатом. И если я создал исключение 'alertDialog = new AlertDialog.Builder (null) .create();' строка вызвала NPE. Так что в этом фрагменте кода было много «нулей» – nabroyan

Смежные вопросы