Android Asynctask: необходим ли внутренний класс?

Я попытался подключиться к сети в Android с помощью Asynctask и преуспел лучше или нет.

Что мне интересно: необходимо ли сделать внутренний класс Asynctask?

Я не сделал это как форму внутреннего класса, но руководство Google API говорит, что AsyncTask must be subclassed to be used. (Но я этого не делал, и он работает …) – http://developer.android.com/reference/android/os/AsyncTask.html

И почему Asynctask принимает форму класса, хотя он выполняет только одну основную функцию? (Я думаю, что это должен быть метод, а не класс.)

«AsyncTask должен быть подклассом для использования» не означает внутренний класс; Это означает, что класс расширяет AsyncTask.

Обычно люди AVOID используют 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 Memory), если ваша активность использует много памяти. Лучше держать ссылку на свою активность в WeakReference, чтобы позволить Activity собирать вещи.

Intereting Posts
Лучший способ избежать эффектов алгоритма Nagle с помощью webSockets? Выделение фрагмента круговой диаграммы при нажатии на AChartEngine Java Android – обрезка изображения в ImageView Запустите эмулятор студии Android на процессоре AMD ViewPager внутри Fragment теряет свое содержание, когда фрагмент переименован Как добавить прописку для фонового изображения Использование Gradle для разделения внешних библиотек в разделенных файлах dex для решения ограничений метода Dalvik 64k для Android Может ли AAR включать транзитивные зависимости? В чем разница между getView () и getActivity ()? Захват событий касания в элементе списка android и предотвращение прокрутки Необязательный метод в интерфейсе Java Содержание содержимого панели инструментов Android Изменение цвета фона выбранного элемента в ListView OnSaveInstanceState / onPause – дождитесь, пока состояние полностью сохранено, прежде чем разрешить уничтожение процесса TextView с разными шрифтами и стилями?