我AsyncTask
工作,我不知道为什么我应该使用onPostExecute()
的参数,当我可以只使用一个类级别的实例变量在我AsyncTask
类doInBackground()
之间共享数据onPostExecute()
。AsyncTask.onPostExecute()的参数VS实例变量
这两个工作,但有没有任何亲和骗局的每种方法?
编辑:当我说'实例变量'时,我正在谈论AsyncTask
扩展类中的一个私有实例变量。当班级死亡时,实例变量也会死亡。
我AsyncTask
工作,我不知道为什么我应该使用onPostExecute()
的参数,当我可以只使用一个类级别的实例变量在我AsyncTask
类doInBackground()
之间共享数据onPostExecute()
。AsyncTask.onPostExecute()的参数VS实例变量
这两个工作,但有没有任何亲和骗局的每种方法?
编辑:当我说'实例变量'时,我正在谈论AsyncTask
扩展类中的一个私有实例变量。当班级死亡时,实例变量也会死亡。
那么,它可能会降低内存泄漏的可能性,因为您没有在类级别保存对对象的引用,而只有那些AsyncTask方法。
它也将消除同步问题,因为@nico_ekito提到
我同意@ a.ch。而且它对线程安全也更好。 –
我认为这个答复是有效的。但是,只有'AsyncTask'才会有对实例变量的引用。我没有看到内存泄漏轻松。因为'doInBackground()'和'OnPostExecute()'是同步调用的,所以当调用'OnPostExcetute()'时(如果这是可能的话),JVM仍然不能很好地处理实例变量。 –
除了其他原因公布;如果您在doInBackground()
中遇到异常,则只需将代表错误的参数传递给onPostExecute()
并取消任何其他工作,而不必在发现所有变量都没有正确实例化时再发生异常。
我想你应该使用'取消(布尔)'。这也会跳过'onPostExecute()'。当你想工作条件为你在'doInBackgroud()'中做的事情产生的状态时,你必须在参数中提供状态(丑陋的用两个类型的信息使用相同的参数),或者设置一个实例变量像'mSuccess'(这个解决方案我在一些教程中看到)。 –
我发现在AsyncTask中使用实例变量不是线程安全的。在我的情况下,如果我在doInBackground()中捕获和Exception,我将它设置为我的AsyncTask的Exception实例变量。然后,我会检查变量是否为null或onPostExecute()(我不取消(),因为我可能想显示一个消息在用户例外)。
无论如何,我不时记下我在doInBackground中发现了一个异常,但是在onPostExecute中实例变量将为null。文档确实说这些方法是同步调用的,所以我不能解释为什么会发生这种情况,但我发现它发生了几次。
最后,我将我的“Result”类更改为包含异常和我想传递给onPostExecute的原始结果。这工作得很好。
允许我对接受的答案(和其他人)表示异议。
对于在AsyncTask中使用实例字段将值从一个回调传递到另一个回调,绝对没有线程安全问题。通常这意味着将值从doInBackground()
传递到onPostExecute()
。 AsyncTask中的回调被保证永远不会同时执行,所以没有竞争条件,如果实例字段被设置在先前执行的回调中,也无法丢失实例字段或为null。现在回答。onPostExecute()
参数的
优点:
doInBackground()
的返回值可确保doInBackground()
必须提供返回时的值,以确保它永远不会忘记doInBackground()
和后面的回调之间:onPostExecute()
和onCancelled()
,实例字段可以用于几个可能的目的缺点:
Pair
使用实例字段将值从doInBackground()
传递到onPostExecute()
的优点和缺点基本上与上述相反。
我认为它有用的情况下,你的AsyncTask写在一个单独的类文件 – waqaslam
这不是重点,因为我认为Jop van Raaij意味着AsyncTask本身的类级别 –