2013-04-19 2 views
0

에서 데이터를 듣고 나는 다음과 같은 주요 구성 요소네트워크

이있는 안드로이드 응용 프로그램이되는 스레드로 메시지를 보낼

연결 스레드 에게 IRC에 연결되어에서 메시지를 수신 연결 스레드를 관리하는 서비스 connection 서비스에 바인드 된 사용자.

UI에 버튼이 있으며 버튼을 클릭하면 irc 서버에 메시지를 보내야합니다. 내 생각은 연결 스레드에서 처리기를 생성하고 서비스에서 처리기를 가져온 다음 UI에서 서비스로, 그리고 스레드에서 스레드로 메시지를 보냈다.

스레드의 클래스 수준에서 처리기를 만들면 networkonui 예외가 발생합니다. 내 핸들러의 인스턴스를 run() 메소드로 옮겼고 Looper.prepare()를 사용하도록했다. 나는 내가이 잘못에 접근했다는 것을 느끼고 이것을 어떻게 관리해야하는지에 대한 조언을 구하고있다.

도움을 주시면 감사하겠습니다.

public class MainActivity extends Activity { 

    Handler mHandler,childHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mHandler = new Handler(){ 
      public void handleMessage(Message msg) { 
       TextView tv = (TextView) findViewById(R.id.displayMessage); 
       tv.setText(msg.obj.toString()); 
      } 
      }; 
     new LooperThread().start(); 
    } 



    public void onSend(View v){ 
     Message msg = childHandler.obtainMessage(); 
     TextView tv = (TextView) findViewById(R.id.messageText); 
     msg.obj = tv.getText().toString(); 


     childHandler.sendMessage(msg); 
    } 
    @Override 
    protected void onStart() { 
     super.onStart(); 
     LooperThread ttTest = new LooperThread(); 
     ttTest.start(); 
    } 

    class LooperThread extends Thread { 

     final int MESSAGE_SEND = 1; 

     public void run() { 
      Looper.prepare(); 
      childHandler = new Handler() { 
       public void handleMessage(Message msg) { 
         Message childMsg = mHandler.obtainMessage(); 
         childMsg.obj = "child is sending "+(String)msg.obj; 
         mHandler.sendMessage(childMsg); 
       } 
      }; 
      Looper.loop(); 
     } 
    } 
} 

그 버튼을 누른에 스레드에 메시지를 보낼 수있는 샘플 코드, 다시 스레드 메시지를 보낼 : 내가 안드로이드 배우기 시작했을 때

답변

1

, 내가 looper를 사용하여 스레드에서 메시지를 처리하기 위해이 샘플 코드를 작성 주 활동에 일부 문자열을 추가하여 필요에 따라이 코드를 조작 할 수 있습니다.

기본적으로 활동에는 looper가 있으므로 활동을 위해 looper를 쓸 필요가 없습니다.

스레드에는 기본적으로 루퍼가 없으므로 루퍼와 같은 종류의 큐를 작성하여 메시지를 저장해야합니다.

UPDATE :

XML 코드 써니

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <EditText 
     android:id="@+id/messageText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:hint="Input message"> 
     <requestFocus /> 
    </EditText> 
    <TextView 
     android:id="@+id/displayMessage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     > 

    </TextView> 

    <Button 
     android:id="@+id/buttonSend" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="onSend" 
     android:text="Send" /> 

</LinearLayout> 
+0

안녕하세요. 응답 해 주셔서 감사합니다. 이 접근 방식의 문제점은 스레드가 while() 루프에있어 메시지를 기다리고 있으므로 prepare() 또는 loop()를 추가해야한다고 생각하지 않는다는 것입니다. – Stephen

+0

스레드 자체가 while 루프에있는 경우 don 루프를 사용하지 마라() 나는 생각한다. – Sunny