android异步任务:需要内部类吗?

lrl1mhuk  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(422)

我用asynctask在android中尝试了网络连接,不管成功与否。
我很好奇的是:有必要在类内部创建asynctask吗?
我没有把它作为内部类的一种形式,但是googleapi指南说 AsyncTask must be subclassed to be used. (但我没有这样做,而且很管用……)-http://developer.android.com/reference/android/os/asynctask.html
为什么asynctask采用类的形式,即使它只执行一个主函数(我认为它应该是一个方法,而不是一个类。)

kiayqfof

kiayqfof1#

它不必是一个内部类,它取决于您使用它的目的。
例如,如果您有一个asynctask作为内部类,只有持有它的类才能使用它,但是您有一个asynctask,很多类都在使用它,那么您可能希望将asynctask作为公共类,以便所有人都可以使用它。
它可以用两种方式工作。

de90aj5v

de90aj5v2#

“asynctask必须子类才能使用”并不意味着内部类;这意味着类扩展了asynctask。
通常人们避免将asynctask用作(非静态)内部类,因为有一个大而微妙的问题如下:
您将asynctask创建为活动的内部类,这样它就不用做一些耗时的事情了。根据定义,内部类持有对其“外部”父级的引用(这是它们访问父级数据的方式)。
android关闭活动并重新启动新的活动(例如,当您旋转手机时)。
现在旧活动及其所有资源仍被保留,因为asynctask仍在运行,并保留对旧活动的引用;因此,突然之间,您将内存用于旧版本的活动和新版本的活动。
通过使用静态内部类(不能引用其外父类)或其他类,并且只使用弱的\u引用引用活动,最容易解决这个问题。

brgchamk

brgchamk3#

我很好奇的是:有必要在类内部创建asynctask吗?
不,您可以将其放入外部java文件,也可以将其设置为内部静态类。
asynctask必须是要使用的子类。
它与类是内部的无关,它说您需要创建asynctask的子类ie:

class MyAsyncTask extends AsyncTask

内部类如下所示:

class MyActivity extends Activity {
    // now MyAsyncTask  is inner to MyActivity and has full access to its instance
    class MyAsyncTask extends AsyncTask
    {}
}

为什么asynctask采用类的形式,即使它只执行一个主函数(我认为它应该是一个方法,而不是一个类。)
它执行更多的操作,比如onpostexecute,onpreexecute,仔细看看。它还解耦了异步任务逻辑并允许重用。
如果您希望asynctask是内部的,那么我建议将其设置为静态的,但是为什么不将其设置为外部类呢。内部类始终保持对其外部类的引用,这样在这种情况下,活动在asynctask完成其作业(线程结束)之前不会被垃圾收集,因为网络通信需要时间这可能会导致问题,例如引用泄漏,或者如果活动使用大量内存,则oom(内存不足)异常。最好在weakreference中保留对活动的引用,以便收集活动。

相关问题