Отправить сообщение в поток, который прослушивает данные из сети

У меня есть приложение для Android, которое имеет следующие ключевые компоненты

Служба, которая управляет потоком подключения. Поток подключения, который подключается к IRC и прослушивает сообщения от пользовательского интерфейса подключения, связанного с сервисом.

У меня есть кнопка в пользовательском интерфейсе, и мне нужно отправить сообщение на сервер irc, когда кнопка нажата. Моя идея состояла в том, чтобы создать обработчик в потоке соединения, получить дескриптор для него в моем сервисе, а затем отправлять сообщения из пользовательского интерфейса в сервисы и оттуда в поток.

Когда я создаю обработчик на уровне класса в потоке, я получаю исключение networkonuie. Я переместил создание экземпляра моего обработчика в метод run(), и мне сказали использовать Looper.prepare(). Я чувствую, что я подошел к этому неправильно, и я ищу совет о том, как лучше всего справиться с этим.

Любая помощь будет оценена.

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>
Другие вопросы по тегам