執行的handleMessage()在我的片段:在片段的onCreate創建Android的處理程序()不是在UI線程
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler uiHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
Bundle data = msg.getData();
String text = data.getString("event");
mTextView.setText(text);
}
};
server = new ServerClass(uiHandler);
在onCreateView()我設置mTextView。
ServerClass的@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_main, container, false);
mTextView = (TextView) v.findViewById((R.id.event));
}
相關部分:
public class ServerClass {
private Handler mHandler;
public GameServer(Handler handler) {
mHandler = handler;
}
public void startServer(final int server_port) {
serverThread = new Thread(new Runnable() {
@Override
public void run() {
Socket socket = null;
Bundle data;
Message msg;
try {
serverSocket = new ServerSocket(server_port);
} catch (IOException e) {
e.printStackTrace();
return;
}
while (!Thread.currentThread().isInterrupted()) {
try {
socket = serverSocket.accept();
data = new Bundle();
data.putString("event", "new connection");
msg = new Message();
msg.setData(data);
mHandler.handleMessage(msg);
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
});
serverThread.start();
}
}
我的理解是,由於處理程序的UI線程創建的 - 在該片段中的onCreate() - 是的handleMessage()在處理程序也應在UI線程上執行,但沒有發生。當我得到一個新的連接,我得到了以下錯誤:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
繼堆棧跟蹤的其餘部分結束在爲事業()中的handleMessage含mTextView.setText(text);
線指向。
我曾嘗試都設置與getMainLooper處理程序,但沒有幫助:
Handler mHandler = new Handler(Looper.getMainLooper()){
// ...
我也試着創造onCreateView(處理程序)來代替,但仍然得到了同樣的錯誤。
請告訴我我錯過了一些明顯的東西,這讓我拉我的頭髮。
感謝,這樣一個愚蠢的錯誤 - 這是完全的。我花了很多時間看這個,從來沒有注意到我不小心把handleMessage放在那裏,而不是sendMessage。再次感謝,需要再等5分鐘才能接受您的答案。 – Matthew 2015-04-03 02:33:59