有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Android Asynctask:是否需要内部类?

我使用Asynctask在Android中尝试了网络连接,但成功与否

我好奇的是:有必要在类内部创建Asynctask吗

我没有将其作为内部类的一种形式,但GoogleAPI指南说AsyncTask must be subclassed to be used.(但我没有,它可以工作…)http://developer.安卓.com/reference/安卓/os/AsyncTask.html

为什么Asynctask采用类的形式,即使它只执行一个主函数?(我认为它应该是一个方法,而不是一个类。)


共 (3) 个答案

  1. # 1 楼答案

    它不一定是一个内部类,这取决于你使用它的目的

    例如,如果您有一个AsyncTask作为内部类,只有持有它的类才能使用它,但是您有一个AsyncTask,许多类都在使用它,那么您可能希望将AsyncTask作为公共类,以便每个人都可以使用它

    它可以以两种方式工作

  2. # 2 楼答案

    “AsyncTask必须是子类才能使用”并不意味着内部类;这意味着该类扩展了AsyncTask

    一般来说,人们避免将ASyncTask用作(非静态)内部类,因为有一个大而微妙的问题,它是这样的:

    1. 您将Asynctask创建为活动的内部类,而它正在做一些耗时的事情。根据定义,内部类持有对其“外部”父类的引用(这是它们访问父类数据的方式)
    2. Android会关闭活动并重新启动新活动(例如,当你旋转手机时)
    3. 现在旧活动和所有它的资源仍被保留,因为Asynctask仍在运行,并保留对旧活动的引用;因此,突然之间,你在使用旧版本的活动和新版本的活动的内存

    通过使用静态内部类(不能引用其外部父类)或其他类,并且只使用弱引用引用活动,可以最容易地解决这个问题

  3. # 3 楼答案

    What I'm curious about: Is it necessary to make Asynctask inner class?

    不,您可以将其放入外部java文件,也可以将其设置为内部静态类

    AsyncTask must be subclassed to be used.

    它与类是内部的无关,它表示您需要创建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
        {}
    } 
    

    And why Asynctask takes a form of class even though it performs a only one main function? (I think it should be a method, not a class.)

    它的性能更高,比如onPostExecute、onPreExecute,仔细看看。此外,它还解耦了异步任务逻辑,并允许重用

    如果您希望AsyncTask是内部的,那么我建议将其设置为静态的,但是为什么不将其设置为外部类呢。内部类始终保持对其外部类的引用,这样,在这种情况下,在AsyncTask完成其作业(线程结束)之前,活动不会被垃圾收集,因为网络通信需要时间,这可能会导致问题,例如引用泄漏,或者如果活动使用大量内存,则OOM(内存不足)异常。最好在WeakReference中保留对您的活动的引用,以便收集活动