2016-09-15 137 views
0

我有問題,我無法解決。我正在嘗試爲實驗製作一個接收和發送消息的Android客戶端(帶有多線程,因此我不必等待發送消息的服務器,反之亦然)以及爲Windows編寫的服務器幾乎與Android客戶端一樣,接收和發送消息(這裏還有多線程)。Toast.makeText只被調用一次

final Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      Looper.prepare(); 
      try { 
        in_server = new BufferedReader(new InputStreamReader(client.getInputStream())); //receive from server 
        //Log.i("Message from server", in_server.readLine()); 
        Toast.makeText(MainActivity.this, in_server.readLine(), Toast.LENGTH_SHORT).show(); 
      } catch (IOException e) { 
        Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 
      Looper.loop(); 
     } 
}); 

如果我寫了一段時間(真),而不是兩個彎針,我用「Log.i」,我收到來自服務器,客戶端以及與此服務器的工作完美髮送的所有郵件。但是,如果我刪除「Log.i」,並使用「Toast.makeText」,並且放置了兩個Loopers,就像上面的代碼一樣,我收到從服務器發送的第一條消息,其他消息都未收到。我沒有任何線索如何解決這個問題。

請不要粗魯,我是一個Java新手,我只是在做一些測試,但是我只是失去了一個多小時。

+0

這可能看起來很愚蠢,但是每次的信息都一樣嗎?如果是這樣,那麼Toast在運行多次時似乎只會運行一次。如果消息每次都有所不同,那麼我不知道......那種非常奇怪的行爲。 –

+0

我從服務器發送類似「嗨」的內容,在「你好」之後,我只得到了「嗨」Toast。如果我在一段時間內使用Log.i(true),我會在LogCat中同時獲得「hi」和「hello」。無法弄清楚問題所在。 – ontech7

回答

0

Toasts等待,直到現有的吐司完成其顯示。如果您有一個循環以循環速度不斷makeTexting,則積壓將變得如此之長,以至於不同的消息可能需要很長時間才能顯示出來。

我會提出一個解決方案,檢查是否有更新的消息,然後只顯示如果是,而不是每次都顯示。

+0

我試圖使用「runOnUiThread」。它阻止了我的Android手機,但是當我停止服務器時,我可以看到所有的信息都以「hello」的方式出現,「你是怎麼做的」。如果我可以讓runOnUiThread工作而不阻塞我的手機,我可以解決我的問題。 – ontech7

+0

剛剛解決了,謝謝你:) 我解決了「public void makeToast(final String s)」並在我的「接收線程」中調用它, – ontech7

相關問題