3

我正在为 android 中的 knx 模块开发一个串口应用程序。我可以向 knx modulde 发送和接收推荐信。当从串口收到消息时,我想更改 ui(例如按钮属性)。我用处理程序尝试过,但我无法更改 ui。请帮帮我。

@Override public void OnSerialsData(final byte[] buffer, final int size) { .... }

它是我的串行端口侦听器函数调用 insine ReadThread。该线程从我的活动的不同包中开始。我想用这种方法向主要活动发送一条消息。

4

3 回答 3

6

您可以使用Activity.runOnUiThread()与 UI 线程进行通信。阅读有关进程和线程的更多信息,尤其是有关工作线程的信息。

例如在你的OnSerialsData,你可以打电话

mActivity.runOnUiThread(new Runnable() {
    public void run() {
        mActivity.mButton.setText("message arrived!");
    }
}
于 2012-12-21T14:31:47.707 回答
3

首先,您必须在主要活动中创建一个静态处理程序:

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 方法之前必须创建您的处理程序。

我希望这会有所帮助。

于 2012-12-21T15:34:29.163 回答
1

只是扩展@auselen 答案。

在您的活动上创建以下内容:

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

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

    }
});
} 

然后您可以从任何引用您的活动的类中调用它。如果该类没有对活动的引用,那么您应该将引用传递给它。

于 2012-12-21T14:37:11.863 回答