0

我有一个程序可以将 USB 数据记录到我创建的文件中,并且运行良好。我正在尝试使用 setText 显示其中的一些数据,但是 setText 正确执行一次,然后在下次调用它时出现 Source not found 崩溃。

我在此运行中将 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/Process (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/Process (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/Process (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/Process (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/bus/usb/001/002,mVendorId=1240,mProductId=63,mClass=0,mSubclass=0,mProtocol=0,mInterfaces=[Landroid.os。可打包;@40f9e3b0]

D/ProMeasure2DActivity(1529):打开成功

D/UsbRequestJNI(1529):初始化

D/ViewRootImpl(1529):pckname = com.android.missilelauncher

I/Process (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): hidden #16

D/Finsky (696): [1] 5.onFinished: 安装状态复制成功。

4

1 回答 1

1

根据我在阅读 Luksprog 的评论后所做的研究,以下是似乎可行的实际代码解决方案:

  1. 删除 znum = (TextView) findViewById(R.id.tvZnum); 来自我的 OnCreate。
  2. 替换 znum.setText("help"); 使用此代码:

            this.runOnUiThread(new Runnable() {
                public void run() {
                    ((TextView) findViewById(R.id.tvZnum)).setText("help");
                }
            });
    

    我相信这样做的结果是将 setText 操作添加到主 UI 线程中的队列中。

于 2013-01-17T14:41:11.223 回答