2016-09-07 1 views
0

간단 측면에서 :왜 배경 스레드 산란 것 자체 백그라운드 스레드가 자신의 핸들러 & 루퍼 그냥 알고 .I UI의 구성 요소를 수정하는 산란 할 이유 처리기 및 루퍼

  • 루퍼 : 루프 및 실행 메시지 큐에서 작업

  • 처리기 : 나는이 글에서했다이 조각을 살펴 큐

에 작업이있으세요 게시 인터넷에

public class MyActivityV2 extends Activity { 

    private Handler mUiHandler = new Handler(); 
    private MyWorkerThread mWorkerThread; 

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

     mWorkerThread = new MyWorkerThread("myWorkerThread"); 
     Runnable task = 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(MyActivityV2.this, 
          "I am at the middle of background task", 
          Toast.LENGTH_LONG) 
          .show(); 
        } 
        }); 
       } 
      } 
      mUiHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(MyActivityV2.this, 
         "Background task is completed", 
         Toast.LENGTH_LONG) 
         .show(); 
       } 
      }); 
     } 
     }; 

     // MyWorkerThread == HandlerThread 
     mWorkerThread.start(); 
     mWorkerThread.prepareHandler(); 
     // 2 starting of thread 
     mWorkerThread.postTask(task); 
     mWorkerThread.postTask(task); 
    } 

    @Override 
    protected void onDestroy() { 
     mWorkerThread.quit(); 
     super.onDestroy(); 
    } 
} 

//MyWorkerThread.java 
class MyWorkerThread extends HandlerThread { 

    private Handler mWorkerHandler; 

    public MyWorkerThread(String name) { 
     super(name); 
    } 

    public void postTask(Runnable task){ 
     mWorkerHandler.post(task); 
    } 

    public void prepareHandler(){ 
     mWorkerHandler = new Handler(getLooper()); 
    } 
} 

안드로이드에서 코드 또는 스레드 기초가 부족하다는 점을 완전히 오해하고 있습니다. 미안해.

배경 스레드는 기본적으로 반복됩니다 (두 번). 주요 아이디어는 배경 스레드를 통한 조작 UI 구성 요소입니다.

이 봐 유무 : 조작 UI의 구성 요소의 문제, 왜 그냥 UI 스레드 핸들러의 참조를하지 않을 경우

mWorkerHandler 

왜 배경 스레드가 자체 처리기를 만들 것입니다 및 핸들러를 통해 실행 파일을 게시합니다.

및 백그라운드 스레드가 자신의 Message Queue를 만드는 것을 나타냅니다 자신의 루퍼 (백그라운드 스레드의 루퍼)를 만드는

mWorkerHandler = new Handler(getLooper()); 

. 주 스레드의 메시지 큐가 아닌 백그라운드 스레드 만 가지고 놀면 안됩니까?

미리 감사드립니다.

+0

실제로 달성하고자하는 것은 무엇입니까? – pskink

+0

내 말은, 왜 코드가 UI의 쓰레드 핸들러에 대한 참조를 가지고 있지 않는가? 그래서 루퍼와도 마찬가지다. 배경 쓰레드는 UI 쓰레드의 메시지 큐를 변경하기 위해 왜 자신의 루퍼를 만들까요? –

+0

ok, UI가 아닌 스레드에서 UI를 업데이트 하시겠습니까? – pskink

답변

0

인터넷에서 임의의 기사를 보증 할 수는 없지만이 코드는 처리기를 올바르게 사용하고 있습니다.

public void prepareHandler(){ 
    mWorkerHandler = new Handler(getLooper()); 
} 

이 라인

가 실행 가능한 게시 :이 방법은 백그라운드 스레드에서 코드를 실행하는 핸들러를 만듭니다

private Handler mUiHandler = new Handler(); 

:

이 줄은 UI 스레드에서 코드를 실행하는 핸들러를 만듭니다 배경 스레드 :

mWorkerThread.postTask(task); 
mWorkerThread.postTask(task); 

간단히 말해서 백그라운드 스레드는 우리에게 e 루퍼와 핸들러는 UI 스레드가 UI 스레드를 사용하는 것과 같은 이유 때문에 발생합니다. 따라서 다른 스레드의 코드가 메시지와 실행 파일을 게시 할 수 있습니다.

+0

하지만 내가 틀렸다면 정정하십시오. HandlerThread는 자신의 루퍼와 핸들러입니다. 그래서 내 관점이 맞다면, 기본적으로 백그라운드 스레드는 시퀀스에서 그 실행 파일을 실행하기 위해 자체 큐 (핸들러 & 루퍼)를 생성합니다. –

+0

핸들러 스레드는 "루퍼가있는 새 스레드를 시작하기위한 핸디 클래스입니다. 루퍼를 사용하여 핸들러 클래스를 만드는 데 사용할 수 있습니다."그래서 루퍼는 있지만 핸들러는 없으므로 사용자는 절반 만 잘못되었습니다. –

+0

아니요, 일반 스레드는 자체 핸들러도 가질 수 있지만 물론 수동으로 생성 한 후에도 가능합니다. * mUiHandler *가 * mWorkerHandler *에 전달되지 않으므로 다른 핸들러가됩니다. 스레드가 루퍼 (자체 큐를 관리하기 위해)를 가지고 있다면, 누가 그 두 작업 (mWorkerThread.postTask (task);)을 (백그라운드 스레드의) 대기열에 추가 할 것입니다. –