避免做onPostExecute()

时间:2013-12-12 12:57:09

标签: android android-asynctask

当使用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()?

3 个答案:

答案 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)并执行任何操作。

恕我直言,你必须在意外结果和取消任务之间做出改变:

  • 第一个由catch块快速管理,让你知道执行期间发生的事情;
  • 第二个仅在您想要中断任务时才有用,例如您按后退按钮。

我是如何使用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())来检查它是否被取消。