异步任务最佳实践

3

在Android中,关于异步任务的最佳实践是将它们包含在您正在工作的Activity的内部类中,还是更好地将它们作为独立的自己的类?例如:

public MyClass extents Activity
{
       public void onCreate(){
       }

       public class MyAsyncTask extents AsyncTask<Void, Void, Void>
       {
               protected void doInBackground()
               {
                     //do stuff here....
               }
       }
       public void onResume(){
       }
}

作为内部类或外部类
public class MyAsyncTask extents AsyncTask<Void, Void, Void>
{
       protected void doInBackground()
       {
           //do stuff here....
       }
}


public MyClass extents Activity
{
       public void onCreate(){
       }
}

取决于你正在做什么 - 真的没有“最好的方法”。如果它很大/长,我会将其放在自己的文件中,就像任何其他类一样,这样你的代码就不会凌乱。但是否则真的无关紧要。另外值得注意的是,Stack Overflow并不是“意见”问题的正确场所 - 你可能会在其他地方得到更好的答案。 - Jonas Czech
1
@ JonasCz 嗯,实际上这很重要...如果内部类是静态的,那就没什么关系了。在其他情况下,它包含对外部类的引用,如果它是一个活动(Activity) ,那将是错误的,因为异步任务(AsyncTask)可能会存在更长的时间。 - Selvin
@Selvin - 这并不意味着它是“错误的”...这只是意味着您必须处理这些引用,并确保在生命周期更改期间正确处理所有内容,这是完全可能的。即使AsyncTask在单独的类文件中,这也可能是一个问题。 - NoChinDeluxe
你无法在内部非静态类中摆脱外部类的引用... 因此,即使您使AsyncTask在方向更改时保持活动状态并将其保留在新Activity中,这也是错误的,因为旧Activity应该被释放,但没有任何方法可以做到这一点... - Selvin
1个回答

9

AsyncTask 有自己的生命周期,它不依赖于 Activity 的生命周期。当 activity 已经销毁时,您需要确保 AsyncTask 没有对 activity 或视图的引用。

仅当 AsyncTaskstatic 时,将其实现为内部类才有意义。如果它不是静态的,则会有一个隐式引用到外部 activity,这将导致内存泄漏。如果您需要从静态异步任务中引用视图,请使用 WeakReference

AsyncTask 实现为单独的文件也是一个好主意,但相同的规则适用。如有需要请使用弱引用。

静态内部异步任务和单独文件中的异步任务之间唯一的区别是代码可读性。如果异步任务中有很多逻辑,请使用单独的文件。


我使用内部AsyncTask是因为我需要更新UI,例如显示/隐藏装载器和更新ConversationAdapter列表,但我没有将其声明为静态的,因为有许多字段要像show/hide组件一样是静态的,而ConversaationList也是。所以我需要确认这是否会导致内存泄漏或使用更多内存。 - Arul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接