2012-12-06 7 views
1

Android에서 클라이언트를 만들려고합니다. 이 클라이언트는 클라이언트 소켓을 생성하고 항상 문자열을 수신하기 위해 소켓을 청취하는 다른 스레드를 시작하는 스레드를 실행합니다. 클라이언트에서 PC로 실행되는 Java 서버로 String을 보낼 때 모든 것이 정상이지만 서버에서 Android 클라이언트로 String을 전송하면 응용 프로그램이 종료됩니다. 이 오류가 발생하는 이유는 무엇입니까? 여기 Android : 소켓에서 읽을 때 강제 종료

는 클라이언트의 주요 활동의 코드입니다 : 그것은 당신의 로그 캣 출력을 보지 않고 말을하기 어렵다

import java.io.DataInputStream; 
    import java.io.DataOutputStream; 
    import java.io.IOException; 
    import java.net.Socket; 

    import android.os.Bundle; 
    import android.app.Activity; 
    import android.view.Menu; 
    import android.view.View; 
    import android.widget.EditText; 
    import android.widget.TextView; 

    public class MainActivity extends Activity { 
     TextView chatHistorial; 
     EditText msg; 
     Socket client; 
     DataInputStream in; 
     DataOutputStream out; 
     Boolean cerrar; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      Thread t = new Thread(new Runnable(){ 
       @Override 
       public void run() { 
        try{ 
         client = new Socket("192.168.1.33", 4444); 
         in = new DataInputStream(client.getInputStream()); 
         out = new DataOutputStream(client.getOutputStream()); 
         cerrar = false; 

         chatHistorial = (TextView) findViewById(R.id.chatHistorial); 
         msg = (EditText) findViewById(R.id.msg); 

         ThreadLectura tl = new ThreadLectura(in, cerrar, chatHistorial); 
         tl.start(); 
        } 
        catch(Exception e){ 
         // ... 
        } 
       } 
      }); 

      t.start(); 

      findViewById(R.id.enviar).setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        String cadena = msg.getText().toString(); 
        try { 
         out.writeUTF(cadena); 
        } catch (IOException e) { 
         // ... 
        } 
        if(cadena.equals("exit")) 
         cerrar = true; 
       } 
      }); 
     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      // Inflate the menu; this adds items to the action bar if it is present. 
      //getMenuInflater().inflate(R.menu.activity_main, menu); 
      return true; 
     } 

    } 

    class ThreadLectura extends Thread{ 
     DataInputStream in; 
     String cadena; 
     TextView chatHistorial; 
     Boolean cerrar; 

     public ThreadLectura(DataInputStream in, Boolean cerrar, TextView tv){ 
      this.in = in; 
      this.cerrar = cerrar; 
      chatHistorial = tv; 
     } 

     @Override 
     public void run(){ 
      try{ 
       while(!cerrar){ 
        cadena = in.readUTF(); 
        chatHistorial.append("Has recibido: " + cadena); 
       } 
      } 
      catch(IOException ioe){ 
       System.out.println("Error de entrada/salida: "+ioe.getMessage()); 
      } 
     } 
    } 
+3

왜이 오류가 발생합니까? 오류가 무엇입니까? logcat 게시 – FoamyGuy

답변

2

,하지만 난 당신이 내에서 UI를 수정하려고 시도하기 때문에 그것의 걸거야 당신의 배경 스레드입니다. ThreadLectura 내에서이 줄 : chatHistorialTextView 같이

chatHistorial.append("Has recibido: " + cadena); 

은 아마도 문제입니다. 기본 UI 스레드 내에서만 UI를 수정하면됩니다.

+0

고마워, 이것이 문제였던 것 같습니다. 해당 줄을 제거하면 오류가 발생하지 않지만 TextView의 텍스트를 편집해야합니다. 어떻게 문자열을받을 때마다 기본 UI 스레드에서 해당 텍스트를 편집 할 수 있습니까? – susomena

+0

몇 가지 옵션이 있습니다. 첫 번째는 ['Handler'] (http://developer.android.com/reference/android/os/Handler.html)를 사용하여 배경 스레드에서 핸들러로 메시지를 보내고, 'handleMessage' 메소드 내에서 UI 업데이트를 수행합니다. 다른 옵션은'Thread' 코드를 제거하고 그것을''AsyncTask' (http://developer.android.com/reference/android/os/AsyncTask.html)로 대체하는 것입니다. 그런 다음'onPostExecute'에서 UI 업데이트를 수행합니다. –

관련 문제