2015-04-03 38 views
0

執行的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(處理程序)來代替,但仍然得到了同樣的錯誤。

請告訴我我錯過了一些明顯的東西,這讓我拉我的頭髮。

回答

1

Only the original thread that created a view hierarchy can touch its views.

因爲調用了handleMessage方法使用來自非ui線程的Handler對象。

從非UI線程使用Handler.sendMessage方法來發送消息:

    Message msg = mHandler.obtainMessage(); 
        data = new Bundle(); 
        data.putString("event", "new connection"); 
        msg.setData(data); 
        mHandler.sendMessage(msg); 
+0

感謝,這樣一個愚蠢的錯誤 - 這是完全的。我花了很多時間看這個,從來沒有注意到我不小心把handleMessage放在那裏,而不是sendMessage。再次感謝,需要再等5分鐘才能接受您的答案。 – Matthew 2015-04-03 02:33:59

相關問題