我在Android中尝试使用Asynctask进行网络连接,并且成功与否。
我很好奇:是否有必要制作Asynctask内部类?
我没有把它作为内部类的一种形式,但Google API指南说AsyncTask must be subclassed to be used.
(但我没有,它的工作原理......) - http://developer.android.com/reference/android/os/AsyncTask.html < / p>
为什么Asynctask采用一种类的形式,即使它只执行一个主函数? (我认为它应该是一种方法,而不是一种类。)
答案 0 :(得分:16)
&#39; AsyncTask必须被子类化才能使用&#39;内在阶级并不意味着内心阶级;它意味着该类扩展了AsyncTask。
一般来说,人们使用ASyncTask作为(非静态)内部类来避免,因为存在一个大而微妙的问题,如下所示:
这个难度最容易通过使用静态内部类(不能引用它的外部父类)或不同的类来解决,只使用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被收集起来。