0

次の主要コンポーネントを持つ Android アプリがあります

接続スレッドを管理するサービス IRC に接続し、接続からのメッセージをリッスンする接続スレッド サービスにバインドされている ui。

UI にボタンがあり、ボタンがクリックされたときに irc サーバーにメッセージを送信する必要があります。私のアイデアは、接続スレッドでハンドラーを生成し、サービスでハンドラーを取得してから、UI からサービスにメッセージを送信し、そこからスレッドにメッセージを送信することでした。

スレッドのクラス レベルでハンドラーを作成すると、networkonuiexception が発生します。ハンドラーのインスタンス化を run() メソッドに移動したところ、Looper.prepare() を使用するように指示されました。私はこれに間違ったアプローチをしたと感じており、これを管理する最善の方法についてアドバイスを求めています.

どんな助けでも大歓迎です。

4

1 に答える 1

1

私がAndroidを学び始めたとき、次のサンプルコードを使用してスレッド内のメッセージを処理するように書きましたlooper:

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();
        }
    }
}

ボタンを押すとスレッドにメッセージを送信し、メインアクティビティに文字列を追加してスレッドが再度メッセージを送信するサンプルコードです。必要に応じてこのコードを操作できます。

アクティビティにはデフォルトでルーパーがあるため、アクティビティ用にルーパーを記述する必要はありません。

スレッドにはデフォルトでルーパーがないため、メッセージを格納するためのある種のキューであるルーパーを記述する必要があります。

アップデート:

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>
于 2013-04-19T12:26:33.690 に答える