2016-11-14 45 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); 
     } 
    } 
}