2016-09-07 1 views
0

Android에서 처리기를 설명하는 사이트 (스레딩 항목)에서이 스 니펫을 가져 왔습니다. 두 번째로 출력 작업에서 판단일련 번호로 처리기의 내용을 처리합니다.

@Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      Thread myThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       for (int i = 0; i < 4; i++) { 
        try { 
         TimeUnit.SECONDS.sleep(2); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
        if (i == 2) { 

         mUiHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(MyActivity.this, "I am at the middle of background task", 
           Toast.LENGTH_LONG) 
           .show(); 
         } 
         }); 
        } 
       }//ends for() 

       // THE SECOND HANDLER, RIGHT HERE! 
       mUiHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(MyActivity.this, 
          "Background task is completed", 
          Toast.LENGTH_LONG) 
          .show(); 
        } 
       }); 
      } //ends run() 
      }); 
      myThread.start(); 

기사의 작가가 거의 확실 번째 Handler가 마지막으로 실행된다는 것입니다 같은

Toast.makeText(MyActivity.this, 
         "Background task is completed", 
         Toast.LENGTH_LONG) 
         .show(); 

이 보인다 인 Handler을 실행.

내 질문은 두 번째 Handler이 첫 번째 작업이 끝난 직후에 실행될 것이라는 사실이 맞는지 여부입니다. 하지만, 여러 번 실행했을 때, 예, 마지막으로 실행됩니다. 내 생각에 Handler은 백그라운드에서 수행됩니다. Thread 그러면 Handler이 먼저 실행될 두 가지 작업을 알지 못합니다. 설명이 필요합니다, 미리 감사드립니다.

답변

1

new Thread(...) 생성자에 전달 된 가장 익명의 Runnable은 백그라운드 스레드에서 실행되는 것입니다. 실행 파일 안의 모든 것은 순차적으로 실행됩니다.

그 실행 파일은 for 루프이므로 그 후에 만 ​​최종 토스트가 나타나면 루프 본문 이후에 실행된다는 보장을 받게됩니다.

+0

그래서 "처리기 실행 순서"가 아닌 "작업 실행 순서"가 될 가능성이 더 큽니까? –

+1

처리기를 스레드 간 통신 방법으로 생각하십시오. 토스트는 "메인"또는 "UI"스레드에서만 표시 할 수 있습니다. 메인 쓰레드가 코드를 실행하도록 요청하는 방법은 핸들러를 통해 이루어진다. 그래서 코드는 토스트가 "완료되었습니다"라고 묻기 전에 "중간에"토스트하도록 메인 스레드에 요청합니다. 기술적으로, 메인 쓰레드가 차단되면, 요청이 실행될 때까지 기다릴 수도 있지만, 어떤 경우에는 요청 된 순서대로 처리하게됩니다. – orip

+0

알았어. 기본적으로 작업은 같은 스레드에서 시작하므로 시퀀스가 ​​여전히 중요합니다. –

2

내 질문은 두 번째 처리기가 일 것입니다. 첫 번째 처리기가 작업을 마친 직후에 실행됩니다.

Handler 인스턴스 (또한 메시지 큐 불리는) 하나 Thread에 관련된다.

Runnable이이 Thread에서 순차적으로 실행됩니다.

post()을 호출하면 해당 큐의 끝에 Runnable이 붙을 것이므로 예, 두 번째 Runnable은 첫 번째 이후에 실행됩니다.

1

UI 스레드 (mUiHandler)에는 처리기가 두 개인 경우가 하나뿐입니다. 보조 스레드가 Runnable 개체를 생성하여 Handler에 게시 중입니다. 그들은 처리기에 의해 게시 된 순서대로 처형 될 것입니다. 스레드의 루프가 먼저 실행되고 게시되기 때문에 스레드는 "두 번째"Runnable을 게시하여 작업을 마칩니다. 두 번째 스레드는 루프 내에 게시 된 다른 작업과 관련하여 항상 마지막으로 실행됩니다.