在循环中写入TextView时,Android程序崩溃

时间:2014-05-18 20:10:09

标签: android multithreading usb textview

我正在尝试编写一个串行监视器。我按照Android指南进行USB输入,并使用this post作为参考。我在后期工作中得到了代码,但我不想写日志。我想将输入写入textView(或UI上的某些文本字段),但它只是崩溃。我还希望能够从可编辑的文本字段中读取并通过USB连接发送数据。

我的设置与上面的帖子非常相似,但使用了不同的run()函数:

@Override
public void run() 
{
    mRunning = true;

    terminalWindow.append("Hello from thread.");
    while(mRunning)
    {
        byte[] recordIn = new byte[endpoint.getMaxPacketSize()];
        if(connection.bulkTransfer(endpoint, recordIn,recordIn.length, 1000)>0)
        {
            String infoIn = new String(recordIn);
            terminalWindow.append(infoIn.toString());
        }


    }
}

如何将infoIn字符串写入TextView terminalWindow?我是否需要添加某种sleep()函数? (我尝试在读取之间计数到1000万,但一旦它返回,它也会崩溃)

----------- UPDATE

感谢您的快速回复。我不得不稍微改变一下代码。为了连接到串行桥,我必须断开我的Android设备与计算机的连接,这意味着我没有任何日志。但是,我认为没有调用USB库,我遇到的问题是一样的:

05-19 22:50:38.674: W/dalvikvm(7809):       threadid=11: thread exiting with uncaught exception (group=0x4159c7c0)
05-19 22:50:38.679: E/AndroidRuntime(7809): FATAL EXCEPTION: Thread-1617
05-19 22:50:38.679: E/AndroidRuntime(7809): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5908)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:869)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.view.ViewGroup.invalidateChild(ViewGroup.java:4253)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.view.View.invalidate(View.java:10546)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.view.View.invalidate(View.java:10501)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.widget.TextView.updateAfterEdit(TextView.java:7340)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.widget.TextView.handleTextChanged(TextView.java:7363)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9076)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:253)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:30)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.widget.TextView.append(TextView.java:3355)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at android.widget.TextView.append(TextView.java:3342)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at com.knolledge.cerealmonitor.MainActivity.run(MainActivity.java:119)
05-19 22:50:38.679: E/AndroidRuntime(7809):     at java.lang.Thread.run(Thread.java:841)

查看此日志以及CommonsWare提供的上下文,问题似乎确实是我有更新UI的线程。老实说,我甚至不想使用新线程。但是,Android文档提示它。那么这样做的最佳方式是什么?我是否应该让线程发送一个事件并让UI监听新读取的缓冲区?并且connection.bulkTransfer是否会永远轮询连接,或者有没有办法让它睡眠并且只在中断后读取传入的数据包?

1 个答案:

答案 0 :(得分:1)

使用runOnUiThread terminalWindow附加或使用AsyncTask代替Thread onProgressUpdate/publishProgress进行文字追加 第二种方式更正确