Android Asynctask:内部类是否必要?

时间:2015-01-15 06:58:16

标签: java android android-asynctask

我在Android中尝试使用Asynctask进行网络连接,并且成功与否。

我很好奇:是否有必要制作Asynctask内部类?

我没有把它作为内部类的一种形式,但Google API指南说AsyncTask must be subclassed to be used.(但我没有,它的工作原理......) - http://developer.android.com/reference/android/os/AsyncTask.html < / p>

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

3 个答案:

答案 0 :(得分:16)

&#39; AsyncTask必须被子类化才能使用&#39;内在阶级并不意味着内心阶级;它意味着该类扩展了AsyncTask。

一般来说,人们使用ASyncTask作为(非静态)内部类来避免,因为存在一个大而微妙的问题,如下所示:

  1. 您将Asynctask创建为您的活动的内部类,并且不需要花费很多时间。根据定义,内部类别可以引用他们的“外部”类别。 parent(这是他们访问父母数据的方式)。
  2. Android会关闭活动并重新启动新活动(例如,当您旋转手机时)。
  3. 现在旧的活动和所有它的资源仍然被保留,因为Asynctask仍在运行并持有对旧活动的引用;突然之间,您正在为旧版本的活动和新版本的活动使用内存。
  4. 这个难度最容易通过使用静态内部类(不能引用它的外部父类)或不同的类来解决,只使用weak_reference引用活动。

答案 1 :(得分:4)

它不一定是内部类,它取决于你使用它的内容。

例如,如果你有一个AsyncTask作为内部类,只有拥有它的类可以使用它,但你有一个很多类正在使用的AsyncTask,你可能想把AsyncTask作为一个公共类,所以每个人都可以使用它。

它可以两种方式工作。

答案 2 :(得分:3)

  

我很好奇:是否有必要制作Asynctask内部类?

不,你可以把它放到外部java文件中,或者你也可以把它变成内部静态类。

  

AsyncTask必须是子类才能使用。

它与内部类无关,它表示你需要创建一个AsyncTask的子类,即:

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成为内在的,那么我建议让它成为静态的 - 但是为什么不把它变成外部类。内部类总是保持对它的外部类的引用,这种方式在这种情况下,Activity不会被垃圾收集,直到AsyncTask完成它的工作(线程结束),因为网络通信需要时间,这可能会导致问题 - 比如泄漏引用或OOM(Out Of内存)异常,如果您的活动使用大量内存。最好继续引用WeakReference中的Activity,以允许Activity被收集起来。