【问题标题】:Android Asynctask: Is inner class necessary?Android Asynctask:内部类是否必要?
【发布时间】:2015-01-15 06:58:16
【问题描述】:

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

我很好奇:Asynctask 有必要做内部类吗?

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

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

【问题讨论】:

  • 你是如何在没有子类化的情况下使用它的?在不覆盖任何方法的情况下,它实际上为您做了什么?它本来可以设计成有一个接口而不是一个类,但是在某些方法是可选的(例如 onPostExecute)的情况下创建一个类的模式相当普遍。
  • 请注意,文档说您必须创建一个 subclass - 而不是 inner 类。目前尚不清楚您的问题是关于内部类还是子类。

标签: java android android-asynctask


【解决方案1】:

'AsyncTask 必须被子类化才能使用'并不意味着内部类;这意味着该类扩展了 AsyncTask。

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

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

通过使用静态内部类(不能引用它的外部父级)或不同的类并且只使用weak_reference 引用活动,最容易解决这个困难。

【讨论】:

    【解决方案2】:

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

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

    它可以双向工作。

    【讨论】:

      【解决方案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 被垃圾收集。

      【讨论】:

      • 我创建了一个名为User的类,我想在这个类中创建一些方法。(例如user.login()user.getHtml()user.downloadFile() ...)但是在Android中,网络连接应该在doInBackground() 方法中。那么,如果我想制作所有这些方法,我是否应该在只有一个doInBackground() 方法中制作这些功能???
      • 从 doInBackground 方法调用你的 User 类方法。
      猜你喜欢
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2011-01-23
      相关资源
      最近更新 更多