2012-07-04 4 views
1

У меня есть попытка и поймать в «doInBackground», я не хочу, чтобы код запускался onPostExecute, если приложения выполняют метод catch в «doInBackground». код, как показано ниже:asynctask cancel onpostexecute

public class DownloadFileAsync extends AsyncTask<String, Integer, Void> { 
     @Override 
     protected void onPreExecute(){ 
      super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(String... aurl) { 
     try{ 
      //some code, jump to onPostexecute after complete 
     } 
     catch{ 
      //some code, don't do onPostExecute after complete 
     } 
     return null; 

     } 

    @Override 
    protected void onProgressUpdate(Integer... progress) {   
    //some code 
    } 

    @Override 
    protected void onPostExecute(Void unused) { 
    //some code 
    } 
} 

ответ

3

Возврат логический тип данные из вашего doInBackground() в onPostExecute() вашего AsyncTask. И проверить свои ценности, что вы хотите сделать для достижения успеха,

@Override 
    protected boolean doInBackground(String... aurl) { 
     try{ 
      //some code, jump to onPostexecute after complete 

     return true; 
     } 
     catch{ 
      //some code, don't do onPostExecute after complete 

     return false; 
     } 
     } 

и

@Override 
    protected void onPostExecute(boolean flag) { 
    if(flag) 
    { 
     //some code 
    } 
    } 
+0

ТНХ, это работает для меня :) – melvintcs

1

Вы можете иметь логическую переменную в вашем AsyncTask и проверить для этой переменной. Например:

public class DownloadFileAsync extends AsyncTask<String, Integer, Void> { 

private boolean run_do_in_background = true; 

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

@Override 
protected Void doInBackground(String... aurl) { 
    try{ 
     //some code, jump to onPostexecute after complete 
    } 
    catch{ 
     //some code, don't do onPostExecute after complete 
     run_do_in_background = false; 
    } 
    return null; 

    } 

@Override 
protected void onProgressUpdate(Integer... progress) {  

//some code 
} 

@Override 
protected void onPostExecute(Void unused) { 
if(run_do_in_background) { //only if this is true will excecute the code in doInBackground 
//some code 
} 
} 
} 
1

Используйте Pair, так что вы можете вернуть два результата

Пример заменить НИЧЕГО с типом, который вы хотите вернуть:

public class DownloadFileAsync extends AsyncTask<String, Integer, Pair<Exception, ANYTHING> > {  
    @Override 
    protected Pair<Exception, ANYTHING> doInBackground(String... aurl) { 
     try{ 
      return new Pair<Exception, ANYTHING>(null, /* anything can go here */); 

     } 
     catch (Exception e) { 
      return new Pair<Exception, ANYTHING>(e, null); 
     }  
    } 

    @Override 
    protected void onPostExecute(Pair<Exception, ANYTHING> result) { 
     // Evaluate the exception here 
     if(result.first != null) { 
      // an eror occured, do something about it 
     } 
    } 
} 

Этот способ позволяет обрабатывать исключение в onPostExecute, а также получить результат от результата. Если все будет хорошо.

6

Вы можете попробовать использовать cancel(true) в doInBackground(). Попробуйте следующий код:

protected Void doInBackground(String... aurl) { 
    try{ 
     //some code, jump to onPostexecute after complete 
    } 
    catch{ 
     cancel(true); 
    } 
    return null; 

    } 

Официальное примечание на cancel()

Вызов этого метода приведет к onCancelled (Object), которые вызываются в потоке пользовательского интерфейса после doInBackground (Object []) возвращает. Вызов этого метода гарантирует, что onPostExecute (Object) никогда не вызывается. После использования , вызывающего этот метод, вы должны проверить значение, возвращаемое isCancelled() периодически из doInBackground (Object []), чтобы закончить задачу как можно раньше.

Проверить эту ссылку для получения дополнительной информации:

http://developer.android.com/reference/android/os/AsyncTask.html#cancel(boolean)

+0

Возможно, лучший ответ, поскольку в нем говорится в документации: Вызов этого метода гарантирует, что onPostExecute (Object) никогда не вызывается. источник: http://developer.android.com/reference/android/os/AsyncTask.html#cancel%28boolean%29 –

+0

thx для ответа, короткий и очень понятный. но это не работает для меня :(так или иначе, вверх-как для u :) – melvintcs

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