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 行を削除すると、プログラムは問題なく実行され、データがファイルに保存されます。上記のコードを実行すると、プログラムがクラッシュし、ソースが見つからないというメッセージが表示されます。

savetofile 行を中断してプログラムを開始すると、tvZnum が設定された状態でレイアウトが更新され、問題なく動作します。

次に、コードをステップ実行して setText 行に戻ります。

setText を 2 回目に実行するまでは問題ありませんが、クラッシュします。

クラッシュすると、 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/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/プロセス (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 に答える