2010-11-22 73 views
0

我似乎在更新線程中的TextView時遇到了問題。我有一個我想在各種活動中使用的GameConnection類(它管理一個套接字連接)。它調用本地「onMessage」,然後使用目標處理程序調用調度Message。在這種情況下,「處理程序」在我的GameBrowser活動中。嘗試通過處理程序更新TextField,並獲取CalledFromWrongThreadException

下面是GameConnection類的代碼。

in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
out = new PrintWriter(socket.getOutputStream(),true); 

String message = "".intern(); 

// as a newline character is read, we interpret it as a message 
while ((message = in.readLine()) != null && isConnected){ 
    onMessage(message); 
} 

如上所述,本地方法「onMessage」方法處理消息的分派。

private void onMessage(String message){ 
     ... // create message from String 
     handler.dispatchMessage(msg); 
    } 

但是,當我在GameBrowser類中得到響應時,我得到一個CalledFromWrongThreadException。最初,我使用了一種回調方法,當然這種方法並不奏效。所以,經過一番研究,我發現我必須使用Handler,但我似乎無法做到。

public class GameBrowser extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    Log.d(C.tag, "GameBrowser.onCreate addr:" + this); 

    handler = new Handler(new HandlerCallback()); 

    connection.addMessageListener(handler); 
    connection.connect(); 
    txtGameLabel = (TextView)findViewById(R.id.txtGamesLabel); 
    setContentView(R.layout.game_browser); 


} 

private class HandlerCallback implements Callback{ 

    @Override 
    public boolean handleMessage(Message msg) { 

     if (txtGameLabel == null){ 
      txtGameLabel = (TextView)findViewById(R.id.txtGamesLabel); 
     } 

     String message = msg.getData().getString("message"); 

     Log.d(C.tag, "GameBrowser recieved message " + message); 

     txtGameLabel.setText("Data: " + message); 

     return true; 
    } 
} 

} 

回答

0

我想通了我做錯了什麼。我沒有從套接字線程調用處理程序,而是使用回調函數,然後使用Runnable將其發佈到GameConnection類中的處理程序。當onMessage執行「run」時,執行「updateTextField」,我們回到主線程中。

@Override 
public void onMessage(final String message) { 

    handler.post(new Runnable(){ 
     @Override 
     public void run() { 
      updateTextField(message); 

     } 
    }); 

} 

private void updateTextField(String message){ 
    if (txtGameLabel == null) 
     txtGameLabel = (TextView)findViewById(R.id.txtGamesLabel); 

    txtGameLabel.setText(message); 
} 
相關問題