2012-07-04 120 views
1

我有一个尝试和赶上“doInBackground”,我不会运行代码运行onPostExecute如果应用程序在“doInBackground”执行catch方法。代码如下:asynctask取消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()到您的AsyncTask的onPostExecute()。并检查它的价值你要成功做什么,

@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

THX,它为我工作:) – 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中发生异常,并且如果一切正常,从result.second得到结果。

6

您可以尝试在doInBackground()中使用cancel(true)。试试下面的代码:

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

    } 

的正式照会上cancel()

调用此方法将导致onCancelled(对象)doInBackground之后被调用 在UI线程(对象[])的回报。调用这个 方法可以保证不会调用onPostExecute(Object)。在 调用此方法之后,应该尽可能早地检查由doInBackground(Object [])定期检查由 isCancelled()返回的值以尽快完成 任务。

检查此链接了解更多详情:

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

+0

也许因为它最好的答案在文档中指出:调用此方法保证onPostExecute(对象)从不被调用。来源:http://developer.android.com/reference/android/os/AsyncTask.html#cancel%28boolean%29 –

+0

thx为答案,简短,非常理解。但它不适用于我:(不管怎样,起来就像你:) – melvintcs