2016-09-07 12 views
0

爲什麼一個後臺線程產卵自己的處理程序&尺蠖只是修改。我知道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()); 
    } 
} 

這是要麼我完全誤解代碼或缺乏Android的線程基礎。所以我很抱歉。

後臺線程基本上重複自己(兩次)。主要思想是通過後臺線程操縱UI組件。

看一看這樣的:

mWorkerHandler 

爲什麼會在後臺線程創建自己的處理程序,如果它的操作界面的成分的問題,爲什麼不只是拿UI線程處理的參考,通過處理程序發佈runnable。

mWorkerHandler = new Handler(getLooper()); 

其創建其自己的彎針(後臺線程的尺蠖),這表明在後臺線程創建其自己的消息隊列。它不應該只是玩弄主線程的消息隊列而不是後臺線程。

在此先感謝。

+0

你究竟想要達到什麼目的? – pskink

+0

我的意思是,爲什麼代碼沒有引用UI線程的處理程序,因此,爲什麼後臺線程會創建自己的循環來修改UI線程的消息隊列呢? –

+0

好的,你想從非UI線程更新UI或者什麼? – pskink

回答

0

我無法爲互聯網上的隨機文章擔保,但此代碼正確使用處理程序。

這行創建了在UI線程上運行的代碼的處理程序:

private Handler mUiHandler = new Handler(); 

此方法創建在後臺線程中運行的代碼的處理程序:

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

這些行發佈可運行到後臺線程:

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

所以簡而言之,後臺線程會讓我們因爲UI線程使用它們的原因,所以是一個循環和處理程序:所以其他線程上的代碼可以將消息和可運行對象發佈給它。

+0

但是,如果我錯了,HandlerThread有它自己的活套和處理程序。因此,如果我的觀點是正確的,基本上後臺線程正在創建自己的隊列(處理程序和循環)以按順序執行這些可運行的程序。 –

+0

一個處理程序線程是一個「Handy類,用於啓動一個具有循環的新線程,循環程序可以用來創建處理程序類。」因此它有一個循環程序但不是處理程序,而且你只有一半是錯誤的。 –

+0

不,普通線程也可以有自己的處理程序,但當然在手動創建之後。如果你看到* mUiHandler *沒有被傳遞給* mWorkerHandler *,那麼它們是不同的處理程序。如果線程有循環(管理自己的隊列),那麼你認爲誰會將這兩個任務(mWorkerThread.postTask(task);)添加到隊列中(後臺線程)。 –

相關問題