2012-01-24 39 views
5

AsyncTask工作,我不知道为什么我应该使用onPostExecute()的参数,当我可以只使用一个类级别的实例变量在我AsyncTaskdoInBackground()之间共享数据onPostExecute()AsyncTask.onPostExecute()的参数VS实例变量

这两个工作,但有没有任何亲和骗局的每种方法?

编辑:当我说'实例变量'时,我正在谈论AsyncTask扩展类中的一个私有实例变量。当班级死亡时,实例变量也会死亡。

+1

我认为它有用的情况下,你的AsyncTask写在一个单独的类文件 – waqaslam

+0

这不是重点,因为我认为Jop van Raaij意味着AsyncTask本身的类级别 –

回答

5

那么,它可能会降低内存泄漏的可能性,因为您没有在类级别保存对对象的引用,而只有那些AsyncTask方法。

它也将消除同步问题,因为@nico_ekito提到

+1

我同意@ a.ch。而且它对线程安全也更好。 –

+0

我认为这个答复是有效的。但是,只有'AsyncTask'才会有对实例变量的引用。我没有看到内存泄漏轻松。因为'doInBackground()'和'OnPostExecute()'是同步调用的,所以当调用'OnPostExcetute()'时(如果这是可能的话),JVM仍然不能很好地处理实例变量。 –

0

除了其他原因公布;如果您在doInBackground()中遇到异常,则只需将代表错误的参数传递给onPostExecute()并取消任何其他工作,而不必在发现所有变量都没有正确实例化时再发生异常。

+0

我想你应该使用'取消(布尔)'。这也会跳过'onPostExecute()'。当你想工作条件为你在'doInBackgroud()'中做的事情产生的状态时,你必须在参数中提供状态(丑陋的用两个类型的信息使用相同的参数),或者设置一个实例变量像'mSuccess'(这个解决方案我在一些教程中看到)。 –

1

我发现在AsyncTask中使用实例变量不是线程安全的。在我的情况下,如果我在doInBackground()中捕获和Exception,我将它设置为我的AsyncTask的Exception实例变量。然后,我会检查变量是否为null或onPostExecute()(我不取消(),因为我可能想显示一个消息在用户例外)。

无论如何,我不时记下我在doInBackground中发现了一个异常,但是在onPostExecute中实例变量将为null。文档确实说这些方法是同步调用的,所以我不能解释为什么会发生这种情况,但我发现它发生了几次。

最后,我将我的“Result”类更改为包含异常和我想传递给onPostExecute的原始结果。这工作得很好。

0

允许我对接受的答案(和其他人)表示异议。

对于在AsyncTask中使用实例字段将值从一个回调传递到另一个回调,绝对没有线程安全问题。通常这意味着将值从doInBackground()传递到onPostExecute()。 AsyncTask中的回调被保证永远不会同时执行,所以没有竞争条件,如果实例字段被设置在先前执行的回调中,也无法丢失实例字段或为null。现在回答。onPostExecute()参数的

优点:

  • 参数来源于doInBackground()的返回值可确保doInBackground()必须提供返回时的值,以确保它永远不会忘记
  • 的参数是明确建立关系在doInBackground()和后面的回调之间:onPostExecute()onCancelled(),实例字段可以用于几个可能的目的
参数个

缺点:

  • 它是一个单一的参数,因此你不能通过两个或多个值,作为一种解决方法,你可以在一个类你创造的包裹多个值或许Pair

使用实例字段将值从doInBackground()传递到onPostExecute()的优点和缺点基本上与上述相反。