2010-12-06 52 views
2

我想用一個處理程序在一段時間內執行一些代碼。Android:使用處理程序和postDelayed問題()

這種運作良好,在我的課2,但我這一個對一個問題運行:

我的一個類的擴展活動,並啓動一個線程(即實現Runnable)。

在我的run()方法,我有,在我的其他類:

mHandler = new Handler(); 
mHandler.removeCallbacks(StopRequest); 
mHandler.postDelayed(StopRequest, 30000); 

該計劃似乎在抱怨:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

我不明白爲什麼它被張貼,有人可以幫我嗎?

編輯:我的代碼中添加部分:

  out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(clientSocket.getOutputStream())), true); 

      out.println("VOICE_CALL_REQUEST"); 

      // Wait for a response 

      // Set a timer (about 30 seconds) 
      mHandler = new Handler(); 
      mHandler.removeCallbacks(StopRequest); 
      mHandler.postDelayed(StopRequest, 3000); 

      // Ready reply 
      InputStream stream = clientSocket.getInputStream(); 
      BufferedReader data = new BufferedReader(new InputStreamReader(stream)); 

      String line = data.readLine(); 
      mHandler.removeCallbacks(StopRequest); // Timer is removed here 

,並在定時器擊中30秒:

// Stop a call request after some amount of time 
    private Runnable StopRequest = new Runnable() { 
     public void run() { 
      // Send a message to cancel the voice call 
      out.println("VOICE_CALL_CANCEL"); 

      // Close the port 
      try { 
       clientSocket.close(); 
      } 
      catch (IOException e) { finish(); } 
     } 
    }; 

非常感謝,

Jary

回答

4

你可以用」在工作者線程中創建一個處理程序(除非它有一個通常不會做的活套)。該處理程序需要一個looper,因爲它需要一個評估所有傳入消息並在必要時調用處理程序的點。

您的處理程序需要在UI線程中。如果您想在工作線程中執行某些操作,則需要執行自己的消息處理(您可以在線程中使用同步方法設置工作線程檢查的成員變量),或者,如果您的線程更多是事件 - 你真的可以考慮增加一個活套 - 但是,這不是一種常見的做法。

+0

我應該只使用Timer類嗎?那麼我想做的是發送一個TCP數據包並等待30秒,如果沒有收到答覆(即:其他客戶端沒有選擇一個選項),終止並關閉連接。 – Jary 2010-12-06 03:46:04

2

我找到了解決方案。在onCreate方法中定義處理程序可修復它。其餘的代碼是相同的。謝謝:)