【问题标题】:Android UI thread issueAndroid UI线程问题
【发布时间】:2013-01-17 17:14:16
【问题描述】:

我正在使用 android 中的库连接到终端仿真器,它连接到串行设备(开关)并显示发送/接收的数据。我通过终端下方的文本框或在终端本身输入并在两种情况下都按键盘上的 Enter 键通过连接发送数据。我也可以通过按键发送命令。

我的问题是,只要突出显示终端本身,UI 就不会更新,例如通过按钮发送的命令或从串行设备接收的数据。我可以输入终端本身,然后字符就会出现。如果选择了 editText,一切都会更新。因此,如果我选择终端并发送命令,则只有在选择 editText 后才会显示在屏幕上。很多时候,在我选择了 editText 之后,它仍然不会更新,直到我再次按下终端。很奇怪。所以我的无效工作不好?还是我使用的这个 notifyUpdate 方法并不太明白?

我目前所做的是在接收到数据时调用一个方法,该方法调用一个处理程序,该处理程序每​​ 1000 毫秒更新一次屏幕。 This however does not work when the terminal is selected, why is this?我收到错误消息:“只有创建视图层次结构的原始线程才能触及其视图。”

截图: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();在我的代码中,但显然如果我评论说发生了同样的错误,那条线似乎对我没有任何作用。我不确定错误出在哪里,这样无论我在哪里按,我的屏幕都会一直更新。

【问题讨论】:

  • 你的viewHandler是什么?
  • 它在您的日志中说您正在从 onUpdate 调用 invalidate。您还没有发布代码的相关部分。
  • 我的视图处理程序是什么意思?我从来没有写过任何名为 onUpdate 的东西,它来自我正在使用的库,所以我想这是我写过的东西,但我不知道该放什么。
  • 这是notifyUpdate() - Method in class jackpal.androidterm.emulatorview.TermSession Notify the UpdateCallback registered by setUpdateCallback that the screen has changed.方法的描述所有notifyUpdate所做的就是调用onUpdate();

标签: java android multithreading user-interface


【解决方案1】:

得到它的工作,我只需要在 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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多