将消息发送到UI线程

4
我正在为Android开发一个KNX模块的串口应用程序。我可以向KNX模块发送和接收命令。当从串口接收到消息时,我想要更改UI(例如按钮属性)。我尝试使用处理程序,但我无法更改UI。请帮助我。
以下是我的串口监听器函数,在ReadThread内调用。该线程在与我的活动不同的包中启动。我想在此方法中向主活动发送一条消息。

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

3个回答

6
你可以使用 Activity.runOnUiThread() 与UI线程通信。详细了解 进程和线程,尤其是工作线程
例如,在你的OnSerialsData中,你可以调用
mActivity.runOnUiThread(new Runnable() {
    public void run() {
        mActivity.mButton.setText("message arrived!");
    }
}

这不是一个活动。这是我正在使用的Java类,用于通信串口。 - Fatih POLAT
你需要获取一个句柄来修改那个活动。请查看更新后的答案。 - auselen
致命异常:Thread-123 java.lang.RuntimeException: 无法在未调用Looper.prepare()的线程内创建处理程序。 我尝试执行时出现了该错误。 - Fatih POLAT

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

希望这能有所帮助。


1

仅仅是对 @auselen 答案的拓展。

在你的活动中创建以下内容:

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

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

    }
});
} 

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接