Обмен сообщениями в потоке пользовательского интерфейса

Я разрабатываю приложение serialport для модулей knx в Android. Я могу отправлять и получать комментарии к knx modulde. Я хочу изменить пользовательский интерфейс (например, свойства кнопки), когда сообщение получено из последовательного порта. Я пробовал это с обработчиками, но я не смог изменить интерфейс. Помоги мне, пожалуйста.

@Override public void OnSerialsData (конечный буфер в байтах [], конечный размер int) { .... }

это моя функция слушателя последовательного порта, вызывающая insine ReadThread. Эта тема начинается в разных пакетах с моей деятельностью. Я хочу отправить сообщение в этом методе к основной деятельности.

3 ответа

Решение

Вы можете использовать Activity.runOnUiThread() для связи с потоком пользовательского интерфейса. Узнайте больше о процессах и потоках, особенно о рабочих потоках.

Например, в вашем OnSerialsData, ты можешь позвонить

mActivity.runOnUiThread(new Runnable() {
    public void run() {
        mActivity.mButton.setText("message arrived!");
    }
}

Сначала вы должны создать статический обработчик внутри вашей основной деятельности:

public class MainActivity extends Activity {

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


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

public static Handler myHandler = new Handler(){

    @Override
    public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        super.handleMessage(msg);

        Log.e("Test", msg.getData().getCharSequence("MAINLIST").toString());

    }

};
}

тогда в вашем классе сокетов:

public void OnSerialsData(final byte[] buffer, final int size) {

    Message msg = MainActivity.myHandler.obtainMessage();
    Bundle bundle = new Bundle();
    bundle.putCharSequence("MAINLIST", "IS_OK");
    msg.setData(bundle);
    MainActivity.myHandler.sendMessage(msg);

}

но вы должны убедиться, что ваш обработчик должен быть создан до вызова метода OnSerialsData.

Я надеюсь, что это поможет.

Просто расширяю @auselen ответ.

Создайте на вашей деятельности следующее:

public void messageReceived(final String msg){
runOnUiThread(new Runnable() {

    @Override
    public void run() {
    // Put here your code to update the UI

    }
});
} 

и затем вы можете вызвать это из любого класса, который имеет ссылку на вашу деятельность. Если у класса нет ссылки на действие, то вы должны передать ссылку на него.

Другие вопросы по тегам