2010-10-01 2 views
2

У меня есть AsyncTask, которая получает информацию из Интернета. Иногда соединение терпит неудачу, и процесс обработки данных AsyncTask работает вечно.Проверьте, слишком ли длинна AsyncTask

В doInBackground у меня есть чек в конце, если моя пойманная информация пуста, и если это так, то должна появиться кнопка Positive/Negative, но этого не происходит. Диалог только что запущен.

Как проверить, занимает ли AsyncTask слишком много времени (может быть, 5 секунд) и отклонить диалог?

Фрагмент коды (doInBackground):

//orders is my ArrayList<Order> object, from my own Order class. 
if(orders==null) { 
       pdia.dismiss(); 
       AlertDialog.Builder alt_bld = new AlertDialog.Builder(ctx); 
       alt_bld.setMessage("Try agin?") 
       .setCancelable(false) 
       .setPositiveButton("Try again", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 

        button_refresh.setVisibility(View.GONE); 

        new ListTask().execute(null, null , null); 


       } 
       }) 
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
       dialog.cancel(); 
       } 

       }); 
       AlertDialog alert = alt_bld.create(); 
       alert.setTitle("Connection failed!"); 
       alert.show(); 
      } 
      else { 
       return orders; 
      } 

Заранее спасибо, и скажи мне, если вам нужно больше информации!

+0

где вы отклоняете диалог в случае успеха, то есть заказы! = Null? – bhups

+0

Выше текущего кода, так как я его отклоняю, когда я вызываю для publishProgress() там. – Curtain

ответ

2

Вместо того, чтобы проверить свой результат в doInBackground() вы можете получить значение из процесса и проверить его в onPostExecute(), как это:

protected void onPostExecute(ArrayList<Order> localOrders){ 
    super.onPostExecute(localOrders); 
    if (localOrders==null) { 
     // Paste the positive and negative DialogListeners here 
     // and dismiss the dialog. 
    } 
} 

результат от вашего doInBackground() процесса переходит в параметр onPostExecute «s, оттуда вы можете проверить, пуст ли ваш объект ArrayList или нет.

2

Но затем, написав приведенный выше фрагмент кода в onPostExecute, победит цель правильно? Мы хотим, чтобы пользователь не дождался ответа на 5 секунд с веб-службы и поэтому должен обработать таймаут в самой doInBackground.

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