2016-11-14 39 views
0

我希望我的主UI線程在向工作線程發送空消息執行某些操作之前有效地「休眠」1秒鐘。帶消息的postDelayed()Android

Sleep()是我的問題,因爲我不能quit()線程正確正在執行sleep()一段時間,所以我想將其更改爲postDelayed(runnable r, long msDelay)但它需要runnable對象,而不是Message。我如何更改此代碼?我只是從主UI線程傳遞空消息到工作線程。

UI線程:

public class MainActivity extends Activity 
{ 
    static Worker w1, w2; 

static Handler mainUIHandler = new Handler() 
    { 

     @Override 
     public void handleMessage(Message msg) 
     { 
      String sender = msg.getData().getString("SENDER"); 

      if (Objects.equals(sender, "CPU1")) 
      { 
       mInfoTextView.setText("worker 1 thinking..."); 

        //how to change the following 2 lines to postDelayed()? 
       try{ 
        Thread.sleep(1000); 
        } catch (Exception ignored) { } 

       w2.handler.sendMessage(w2.handler.obtainMessage()); 

      } 
     } 
    }; 
... 
} 

和工作線程

class Worker extends HandlerThread 
    { 
     ... 

     Worker(String name) 
     { 
      super(name); 
     } 


     Handler handler= new Handler() 
     { 
      @Override 
      public void handleMessage(Message msg) 
      { 
       //perform work 
        Foo work = dowork(); 
       //communicate work to the UI thread to update the display 
       Message message = MainActivity.mainUIHandler.obtainMessage(); 

       Bundle bundle = new Bundle(); 
       bundle.putString("NAME", name); 
       bundle.putInt("work", work); 

       message.setData(bundle); 

       MainActivity.mainUIHandler.sendMessage(message); 
      } 
     }; 

     @Override 
     public void run() 
     { 
      this.setName(WorkerThread.class.getName()); 
      this.setPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND); 
     } 
    } 

我試圖創建一個新的Runnable()並將它傳遞給postDelayed():

w2.handler.postDelayed(new Runnable() 
        { 

         @Override 
         public void run() 
         { 
          System.out.println("hello"); 
         } 
        }, 1000); 

但它的不在w2中觸發處理程序

+0

我這樣做,但它不是信令工人處理程序。 - 請參閱OP –

+0

的底部任何人?我仍然堅持 –

+0

你見過'Handler.sendMessageDelayed()'嗎? – nandsito

回答

1

您可以延遲MessageHandler.sendMessageDelayed()

public class MainActivity extends Activity { 

    // ... 

    static Handler mainUIHandler = new Handler() { 

     @Override 
     public void handleMessage(Message msg) { 

      // ... 

      w2.handler.sendMessageDelayed(w2.handler.obtainMessage(), 1000); 
     } 
    } 
}