0

Androidのライブラリを使用してターミナルエミュレータに接続しています。これはシリアルデバイス(スイッチ)に接続し、送受信されたデータを表示します。どちらの場合も、端末の下にあるテキストボックスを介して、または端末自体を入力してキーボードのEnterキーを押すことにより、接続を介してデータを送信します。ボタンを押してコマンドを送信することもできます。

私の問題は、ボタンで送信されたコマンドやシリアルデバイスから受信したデータのように、端末自体が強調表示されている場合は常にUIが更新されないことです。端末自体を入力すると、文字が表示されます。editTextを選択すると、すべてが正常に更新されます。したがって、ターミナルを選択してコマンドを送信すると、editTextを選択したときにのみ画面に表示されます。editTextを選択した後も、ターミナルをもう一度押すまで更新されないことがよくあります。非常に奇妙な。だから私の無効化はうまく機能していませんか?それとも、私が使用していて本当に理解していないのは、このnotifyUpdateメソッドですか?

私が現在行っているのは、データを受信したときにメソッドを呼び出すことです。このメソッドは、1000ミリ秒ごとに画面を更新するハンドラーを呼び出します。しかし、これは端末が選択されている場合は機能しません。これはなぜですか?「ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。」というエラーが発生します。</p>

スクリーンショット:http://i.imgur.com/s4mTt.png

    //terminal view
    EmulatorView view = (EmulatorView) findViewById(R.id.emulatorView);
    mEmulatorView = view;

    public void onDataReceived(int id, byte[] data)
    {
    dataReceived = new String(data);
    ((MyBAIsWrapper) bis).renew(data);
    mSession.write(dataReceived);
    mSession.notifyUpdate();
    viewHandler.post(updateView);
    }

    Handler viewHandler = new Handler();
    Runnable updateView = new Runnable() {
    @Override
    public void run() {
    mEmulatorView.invalidate();
    viewHandler.postDelayed(updateView, 1000);

        }
    }
};

私が使用しているライブラリの関連コード:

 [code]protected void notifyUpdate() {
        if (mNotify != null) {
            mNotify.onUpdate();
        }
    }[/code]

/**
 * Generic callback to be invoked to notify of updates.
 */
public interface UpdateCallback {
    /**
     * Callback function to be invoked when an update happens.
     */
    void onUpdate();
}

これは、メソッドnotifyUpdate()の説明です-クラスjackpal.androidterm.emulatorview.TermSessionのメソッドsetUpdateCallbackによって登録されたUpdateCallbackに、画面が変更されたことを通知します。

mSession.notifyUpdate();かもしれないと思いました。私のコードでは、しかしどうやら私が同じエラーが発生したとコメントした場合、その行はとにかく私のために何もしていないようです。エラーがどこにあるのかわからないので、どこを押しても画面が常に更新されます。

4

1 に答える 1

0

動作するようになりました。UIスレッドでその書き込み行を実行する必要がありました。

public void onDataReceived(int id, byte[] data) {

        dataReceived = new String(data);
        ((MyBAIsWrapper) bis).renew(data);

        runOnUiThread(new Runnable(){
            @Override
            public void run() { 
                mSession.write(dataReceived);       
            }});

        viewHandler.post(updateView);
    }
于 2013-01-18T12:29:20.360 に答える