2

Например, если мы рассмотрим фрагмент кода ниже:Почему жизненный цикл Asynctask или Runnable отличается от жизненного цикла Activity?

public class HandlerExample extends AppCompatActivity { 

    private Handler mLeakyHandler = new Handler(); 
    private TextView myTextBox; 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_samples); 
     myTextBox = (TextView) findViewById(R.id.tv_handler); 

     // Post a message and delay its execution for 10 seconds. 
     mLeakyHandler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       myTextBox.setText("Done"); 
      } 
     }, 1000 * 10); 
    } 
} 

Когда Activity разрушается, либо путем изменения конфигурации или по другой причине, то Runnable не будет. То же самое касается Asynctask s.

Мой вопрос в том, что заставляет его не уничтожаться, даже если оно объявлено в этом Activity?

Считайте, что я спрашиваю о причинах.

+0

если вы не шутите с потоками и жизненным циклом деятельности, грузчики лучшие варианты и. https://developer.android.com/guide/components/loaders.html – uguboz

+0

его разные, потому что они не являются активностью. – petey

ответ

2

Поскольку активность класс работает на UI тему и Runnable, AsyncTask и т.д. работать на фоновые потоки, которые отделены от Ui нити. И завершение Activity не закончится другими потоками, если вы специально не поручите ему сделать это.

Runnable Описание:

Runnable интерфейс должен быть реализован любым классом, экземпляры предназначены для исполнения нити.

AsyncTask Описание:

AsyncTask позволяет правильное и простое использование потока пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты по потоку пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

, а также вы можете узнать больше о Threads, прочитав документацию.

+0

Обработчик не работает на фоне потоков все время. Он работает в потоке, из которого он был создан. Для кода фрагмента выше он работает в потоке пользовательского интерфейса, поскольку он был создан в потоке пользовательского интерфейса. – HiddenDroid

+0

Обработчик работает в потоке, на котором он создан, обработчик - это просто вспомогательный объект для отправки и получения из очереди сообщений. Уничтожение активности также уничтожит обработчик, но не уничтожит runnable, который работает в другом потоке. https://developer.android.com/reference/android/os/Handler.html – V01D1

+0

в потоке пользовательского интерфейса, тогда я вызываю 'Runnable.run()', где это будет выполняться? Я думаю, вы должны уточнить, что в вашем ответе, хотя, а также я думаю, что реализация runnables и других интерфейсов развилась из просто puttin их в потоках – Elltz

1

Что делает его не разрушаемым, даже если оно объявлено в этом мероприятии?

Когда new Handler() вызывается в потоке (основной нити в вашем случае), то Handler связано с очереди сообщений Looper «s нити, отправки и обработки Runnable с и сообщений из очереди. Эти Runnable s и сообщения имеют ссылку на цель Handler. Хотя метод ActivityonDestroy() не является «деструктором», то есть когда метод возвращает экземпляр Activity, он не будет немедленно убит (see), память не может быть GC-ed из-за неявной ссылки на Activity как внешний класс Runnable. Activity не будет GC-ed для времени задержки, то есть до тех пор, пока Runnable не будет помещен в очередь из очереди сообщений Looper и обработан.

Ссылки:

  1. This Handler class should be static or leaks might occur: IncomingHandler
  2. How to Leak a Context: Handlers & Inner Classes

 Смежные вопросы

  • Нет связанных вопросов^_^