当使用AsyncTask并执行doInBackground()
时,我有时会得到一个我不想继续onPostExecute()
的统计数据。
我尝试使用cancel(true);
,但仍然会进入onPostExecute()
这是我的代码:
@Override
protected LiveMatchDetails doInBackground(Void... params) {
try {
events = getLiveMatchEventsList(matchId, FetchPolicy.FROM_NETWORK);
} catch (Exception e) {
Log.e(TAG, "Error loading events", e);
try {
events = getLiveMatchEventsList(matchId, FetchPolicy.FROM_CACHE);
} catch (Exception e1) {
e1.printStackTrace();
cancel(true);
onProgressUpdate();
}
}
return events;
}
有没有办法阻止在doInBAckground()中调用onPostExecute()?
答案 0 :(得分:2)
没有办法避免使用onPostExecute(),但是您可以使用结果部分跳过onPostExecute()代码,如下所示: -
带一面旗帜或任何var。
int flag_response=0;
@Override
protected LiveMatchDetails doInBackground(Void... params) {
try {
events = getLiveMatchEventsList(matchId, FetchPolicy.FROM_NETWORK);
flag_response=1;
} catch (Exception e) {
Log.e(TAG, "Error loading events", e);
try {
events = getLiveMatchEventsList(matchId, FetchPolicy.FROM_CACHE);
} catch (Exception e1) {
e1.printStackTrace();
cancel(true);
flag_response=0;
onProgressUpdate();
}
}
return events;
}
@Override
protected void onPostExecute(String result) {
if(flag_response==1)
// execute your code
else
//skip
}
答案 1 :(得分:1)
如果发生异常,则只将events = null;
放在catch块上并在onPostExecute()中执行此操作:
protected void onPostExecute(YourObject result) {
if (result != null) {
// do whatever you want
}
}
顺便说一句,如果你看一下link:
可以通过调用cancel(boolean)随时取消任务。 调用此方法将导致后续调用isCancelled() 返回true。在调用此方法之后,改为onCancelled(Object) 之后将调用onPostExecute(Object) doInBackground(Object [])返回。确保取消任务 你应该尽快检查返回值 如果可能的话,定期从doInBackground(Object [])获取isCancelled() (例如在循环内部。)
修改强>
如果抛出异常(在 doInBackground 方法中发生的任何事情),您的代码将直接转到 onPostExecute 。如果您调用 cancel(true),那么您必须实现 onCancelled(Object)并执行任何操作。
恕我直言,你必须在意外结果和取消任务之间做出改变:
我是如何使用AsyncTask的。
答案 2 :(得分:1)
只需添加一个私有的Exception成员就可以了解AsyncTask。
private Exception exc = null;
当您捕获异常时,将捕获的异常分配给您的私有exc值。
catch (Exception e1) {
exc = e1;
// ... other handling code.
}
在onPostExecute中检查exc是否为null。如果它为null(无例外)执行您的代码。否则什么都不做或发出错误信息。 修改: 如果你想使用cancel(),只需调用if(isCancelled())来检查它是否被取消。