我有一个程序可以将USB数据记录到我创建的文件中并且工作正常。 我试图使用setText显示一些这些数据,但是setText正确执行一次,然后在下次调用时我得到一个Source not found crash。
我在此运行中将USB数据保存到我的文件中:
@Override
public void run() {
ByteBuffer buffer = ByteBuffer.allocate(64);
UsbRequest request = new UsbRequest();
request.initialize(mConnection, mEndpointIntr);
while (true) {
request.queue(buffer, 64);
if (mConnection.requestWait() == request) {
znum.setText("help");
savetofile("GOT data " + System.currentTimeMillis());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
} else {
Log.e(TAG, "requestWait failed, exiting");
savetofile("10 requestWait failed, exiting");
break;
}
}
}
如果我退出上面的setText行,程序运行愉快,将我的数据保存到文件中。 当我运行上面的代码时,程序崩溃,我得到Source not found指示。
如果我在savetofile行中休息时启动程序,则使用tvZnum设置更新布局以帮助解决问题。
然后我逐步执行代码并返回到setText行。
一切都很好,直到我第二次执行setText,然后崩溃。
它崩溃时似乎是在android.view.ViewRootImpl.checkThread()第4077行。我试着在我的帖子中添加一个屏幕截图,但我还没有足够的声望点。
我宣布:
TextView znum;
在OnCreate中有这个:
znum = (TextView) findViewById(R.id.tvZnum);
并且tvZnum在启动器和R中显示正常。
我知道答案必须简单但很简单,我无法理解。
有任何想法吗?
谢谢, 戴尔
编辑:这是logCat(希腊语给我,我无法弄清楚如何在这里格式化):
I / dalvikvm(1529):threadid = 3:对信号3作出反应
I / dalvikvm(1529):将堆栈跟踪写入'/data/anr/traces.txt'I / System.out(1529):等待调试器解决...
I / System.out(1529):等待调试器解决...
I /处理(167):发送信号。 PID:1529 SIG:3
I / dalvikvm(1529):threadid = 3:对信号3作出反应
I / System.out(1529):等待调试器解决...
I / dalvikvm(1529):将堆栈跟踪写入'/data/anr/traces.txt'I / System.out(1529):等待调试器解决...
I / System.out(1529):等待调试器解决...
I /处理(167):发送信号。 PID:1529 SIG:3
I / dalvikvm(1529):threadid = 3:对信号3作出反应
I / dalvikvm(1529):将堆栈跟踪写入'/data/anr/traces.txt'I / System.out(1529):等待调试器解决...
I / System.out(1529):等待调试器解决...
I /处理(167):发送信号。 PID:1529 SIG:3
I / dalvikvm(1529):threadid = 3:对信号3作出反应
I / dalvikvm(1529):将堆栈跟踪写入'/data/anr/traces.txt'I / System.out(1529):等待调试器解决...
I / System.out(1529):等待调试器解决...
I / System.out(1529):调试器已结算(1359)
I /处理(167):发送信号。 PID:1529 SIG:3
I / dalvikvm(1529):threadid = 3:对信号3作出反应
I / dalvikvm(1529):将堆栈跟踪写入'/data/anr/traces.txt'D / dalvikvm(1529):threadid = 1:撤消后仍然暂停(sc = 1 dc = 1)
D / ProMeasure2DActivity(1529):意图:意图{ act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER] FLG = 0x10000000的 cmp = com.android.missilelauncher / .MissileLauncherActivity}
D / ProMeasure2DActivity(1529):setDevice UsbDevice [MNAME =的/ dev /总线/ USB / 001/002,mVendorId = 1240,mProductId = 63,mClass = 0,mSubclass = 0,mProtocol = 0,mInterfaces = [Landroid.os.Parcelable; @ 40f9e3b0]
D / ProMeasure2DActivity(1529):打开SUCCESS
D / UsbRequestJNI(1529):init
D / ViewRootImpl(1529):pckname = com.android.missilelauncher
I /处理(167):发送信号。 PID:1529 SIG:3
I / dalvikvm(1529):threadid = 3:对信号3作出反应
D / dalvikvm(1529):threadid = 11:撤消后仍然暂停(sc = 1 dc = 1)
I / dalvikvm(1529):将堆栈跟踪写入'/data/anr/traces.txt'I / ActivityManager(167):显示 com.android.missilelauncher / .MissileLauncherActivity:+ 3s791ms
I / ActivityManager(167):不再需要com.android.email(pid 1266): 隐藏#16
D / Finsky(696):[1] 5.onFinished:安装状态复制 成功了。
答案 0 :(得分:1)
基于我在阅读Luksprog的评论后所做的研究,这是实际的代码解决方案似乎有效:
替换znum.setText(“help”);使用此代码:
this.runOnUiThread(new Runnable() {
public void run() {
((TextView) findViewById(R.id.tvZnum)).setText("help");
}
});
我相信这样做的结果是将setText操作添加到主UI线程中的队列中。