Обмен сообщениями в потоке пользовательского интерфейса
Я разрабатываю приложение 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
}
});
}
и затем вы можете вызвать это из любого класса, который имеет ссылку на вашу деятельность. Если у класса нет ссылки на действие, то вы должны передать ссылку на него.