我正在尝试编写一个串行监视器。我按照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是否会永远轮询连接,或者有没有办法让它睡眠并且只在中断后读取传入的数据包?
答案 0 :(得分:1)
使用runOnUiThread
terminalWindow
附加或使用AsyncTask
代替Thread
onProgressUpdate/publishProgress
进行文字追加
第二种方式更正确