2

우리는 아래의 코드 조각을 고려하면, 상기 Activity가 파괴됩니다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); 
    } 
} 

, 구성을 변경하거나 다른 이유로하든, Runnable는하지 않습니다. Asynctask에 대해서도 마찬가지입니다.

제 질문은 무엇입니까? Activity에 신고되었다고해도 그것이 파괴되지 않는 이유는 무엇입니까?

이유에 대해 묻고 있습니다. 활동 클래스는 및 의 Runnable, AsyncTask를UI 스레드에서 실행

+0

, 로더는 u를위한 최고의 옵션입니다. https://developer.android.com/guide/components/loaders.html – uguboz

+0

은 활동이 아니기 때문에 다릅니다. – petey

답변

2

때문에 UI 스레드에서 분리 된 배경 스레드에서 실행됩니다. 그리고 활동을 끝내면 특별히 지시하지 않는 한 다른 스레드가 끝나지 않습니다.

Runnable 설명 :

의 Runnable 인터페이스가 그 인스턴스 의도 스레드가 실행하는 임의의 클래스를 구현한다.

AsyncTask 설명 :

AsyncTask를는 UI 스레드의 적절하고 쉽게 사용할 수 있습니다. 이 클래스 을 사용하면 스레드 및/또는 처리기를 조작하지 않고도 백그라운드 작업을 실행하고 UI 스레드에서 결과를 게시 할 수 있습니다.

Threads에 대한 자세한 내용은 설명서를 참조하십시오.

+0

처리기가 항상 배경 스레드에서 실행되지 않습니다. 그것은 만들어진 스레드에서 실행됩니다. 위의 스 니펫 코드는 UI 스레드에서 생성 되었기 때문에 UI 스레드에서 실행됩니다. – HiddenDroid

+0

핸들러는 생성 된 스레드에서 실행되며 handler는 메시지 큐에서 보내고받는 보조 객체입니다. 액티비티를 파기해도 핸들러는 파괴되지만 다른 스레드에서 실행되는 실행 파일은 삭제되지 않습니다. UI 스레드에서 https://developer.android.com/reference/android/os/Handler.html – V01D1

+0

을 실행 한 다음 Runnable.run()을 호출합니다. 어디에서 실행됩니까? 난 당신이 대답을 명확히해야한다고 생각하고, 또한 나는 runnables 및 기타 인터페이스의 구현 스레드에서 그냥 넣어에서 진화했다고 생각 – Elltz

1

해당 활동에서 선언 되었더라도 파괴되지 않는 이유는 무엇입니까? new Handler()은 스레드 (케이스의 메인 쓰레드)에서 호출

Handler는 큐로부터 처리 Runnable의 메시지를 전송하는, 스레드의 Looper의 메시지 큐와 관련된다. 그것들은 Runnable이고 메시지는 대상 Handler에 대한 참조를 가지고 있습니다. ActivityonDestroy() 메서드는 "소멸자"가 아니지만 메서드가 Activity의 인스턴스를 즉시 반환하지 않을 경우 (see) Activity에 대한 암시 적 참조 때문에 메모리를 GC 할 수 없습니다 Runnable의 외부 클래스입니다. Activity은 지연 시간 동안, 즉 RunnableLooper의 메시지 대기열에서 대기열에서 제외되고 처리 될 때까지 GC 처리되지 않습니다.

참고 : 당신이 스레드 및 활동의 라이프 사이클과 혼란을 해달라고하면

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