繁体   English   中英

Android Asynctask:内部类是否必要?

[英]Android Asynctask: Is inner class necessary?

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

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

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

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

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

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

  1. 您将Asynctask创建为您的活动的内部类,并且不需要花费很多时间。 根据定义,内部类包含对其“外部”父级的引用(这是它们访问父级数据的方式)。
  2. Android会关闭活动并重新启动新活动(例如,当您旋转手机时)。
  3. 现在旧的活动及其所有资源仍然被保留,因为Asynctask仍在运行并且持有对旧活动的引用; 突然之间,您正在为旧版本的活动和新版本的活动使用内存。

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

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

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

它可以在两个方面工作。

我很好奇:是否有必要使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被收集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM