title: error: Only the original thread that created a view hierarchy can touch its views
body: <p>Hi and thank you for looking at my question.
  I am an intermediate programmer in C but an Android newbie. I have been trying to get a chat programming working. Assuming everything else in the code below works perfectly. The one question I like to ask is when I try to <strong>setText()</strong> from a thread running, I get an exception above. I looked at many many websites and here too. Found many things, but I really do not understand. Please explain to me in the most simple way or offer me some simple fix if possible. </p>
  
  <p>Thank you very much!!</p>
  
  <pre><code>public class chatter extends Activity {
  
  private String name = "Unknown User";
  
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
  
  
  
      final EditText msgToServer = (EditText) findViewById(R.id.msgBox);
      final EditText chatFromServer = (EditText) findViewById(R.id.chatBox); 
  
      final Button MsgToServer = (Button) findViewById(R.id.sendButton);
  
      Socket socket = null;
      String ipAddress = "192.168.1.103";
      try {
          InetAddress serverAddr = InetAddress.getByName(ipAddress);
          Socket socketMain = new Socket(serverAddr, 4444);
          socket = socketMain;
      } catch (IOException e) {
          // TODO Auto-generated catch block
          Log.e("TCP", "error", e);
      }
  
      final OutMsg outMsg = new OutMsg(socket);
      Thread msgSenderThread = new Thread(outMsg);
      msgSenderThread.start();
  
      //chatFromServer.post(new InMsg(socket, chatFromServer));
      Thread msgReceiverThread = new Thread(new InMsg(socket, chatFromServer));
      msgReceiverThread.start();
  
      MsgToServer.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              String msgToServerString; 
              msgToServerString = msgToServer.getText().toString();
              outMsg.message = name + ": " + msgToServerString;
              outMsg.readyToSend = true;
              msgToServer.setText("");
          }
      });
  }
  
  public void updateResultsInUi (String msg)
  {
      final EditText chatFromServer = (EditText) findViewById(R.id.chatBox); 
      chatFromServer.setText(msg); 
  }
  
  public class InMsg implements Runnable {
  
      Socket socket;
      EditText chatFromServer;
      public InMsg(Socket socket, EditText chatFromServer)
      {
          this.socket = socket;
          this.chatFromServer = chatFromServer;
      }
  
      public void run(){
          try {
          BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          String str = "FIRSTMESSAGEFROMSERVER";
              while (true)
              {
                  if (str.equals("FIRSTMESSAGEFROMSERVER"))
                      str = in.readLine();
                  else
                      str = str + "\n" + in.readLine();
                  Log.e("TCP", "got the message: " + str);
       //Here is where went wrong******************
                  chatFromServer.setText(str);
       //******************************************
              }
          } catch (IOException e) {
              // TODO Auto-generated catch block
              Log.e("TCP", "error in receiving", e);
          }
      }
  
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      MenuInflater inflater = getMenuInflater();
      inflater.inflate(R.menu.menu, menu);
      return true;
  }
  
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      // Handle item selection
      switch (item.getItemId()) {
      case R.id.setNameMenu:
          setname();
          return true;
      default:
          return super.onOptionsItemSelected(item);
      }
  }
  
  public void populateChatBox (String msgFromS)
  {
      Log.e("TCP", "going in to popC");
      final EditText textNameInput = (EditText) findViewById(R.id.nameBox);
      Log.e("TCP", " popC");
      textNameInput.setText(msgFromS);
      Log.e("TCP", "going out from popC");
  }
  
  public void setname()
  {
      setContentView(R.layout.custom_dialog);
      final EditText textNameInput = (EditText) findViewById(R.id.nameBox);
      Button submitNameButton = (Button) findViewById(R.id.submitNameButton);
      submitNameButton.setOnClickListener(new OnClickListener() {
      @Override
          public void onClick(View v) {
          String nameinput = textNameInput.getText().toString();
              if (!name.equals(""))
                  name = nameinput;
              setContentView(R.layout.main);
          }
      });
  }
  }
  </code></pre>