3

私はAndroidでknxモジュール用のシリアルポートアプリケーションを開発しています。knxmoduldeに表彰を送受信できます。シリアルポートからメッセージを受信したときにui(ボタンのプロパティなど)を変更したい。ハンドラーで試しましたが、UIを変更できませんでした。plssを助けてください。

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

その私のシリアルポートリスナー関数は、非常識な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 に答える