-1

タイトルはほとんど問題を説明しています。

押すとこのスレッドのオン/オフを切り替えるボタンがあります。オンとオフが正常にオン/オフになります...一度オンにすると、再度オンにするとクラッシュします。

private Thread dataThread = new Thread(new Runnable(){
    public void run() {
        while(transmitPackets){
                Log.d("Test","DERP");
        }
    }
});

そしてその実行場所...

toggleButton.setOnClickListener( new View.OnClickListener() {
        public void onClick(View v){
            transmitPackets = !transmitPackets;
            if( transmitPackets ) {
                toggleButton.setText("Pause");
                dataThread.start();
            }
            else {
                toggleButton.setText("Transmit");
            }
        }
    });

transmitPacketsは、ボタンを押すことによって切り替えられるブール値です。このアプリは最終的にネットワーク経由でデータを送信するため、このように名付けられました。スレッドはそれを使用して終了します。

アプリのクラッシュによって生成されたスタックトレースは、スレッドの再起動時にクラッシュしたとだけ言っているので、それを修正する方法を理解するのに特に役立ちません-これは問題自体から明らかでした。

私はAndroidSDKとJavaのスレッドの両方に慣れていないので、どこが間違っているのかわかりません。これは、スレッドでファンキーなことをしようとする前に開始する、可能な限り最も単純なスレッドの実装のようです。

4

4 に答える 4

2

正常にオンとオフを切り替えます...一度、もう一度オンにしようとするとクラッシュします。

それはそう。すでに終了しているスレッドを開始することはできません。新しいスレッドを作成して開始する必要があります。

すでに開始されているスレッドを再開できないという情報は、次のことから明らかであることに注意してください。

  • スタック トレース
  • ドキュメント:_

    スレッドIllegalThreadStateExceptionが以前に開始された場合にスローします

何かが例外を引き起こした場合は、常に例外メッセージ (およびそこに因果情報がある可能性があるため、スタック トレース) とドキュメントを注意深く読む必要があります。

于 2012-12-12T20:30:32.730 に答える
2

スレッドが完了すると、そのスレッドはなくなります。再起動できません。新しいスレッドを作成する必要がある場合があります。スタック トレースがないと、何かを提案するのは難しいです。

スレッドで呼び出しstart()ても、スレッドを再起動しているわけではありません。つまり、新しいスレッドを開始しています。

問題は別の可能性があります。スタック トレースを投稿します。

于 2012-12-12T20:30:56.773 に答える
1

DataThreadスレッドを 1 つだけ作成するため、コードをコードに移動する必要がありますsetOnClickListener。そのため、スレッドを再度「開始」すると、完了したため実行できません。今どこにいるかを宣言する必要がDataThreadありますが、リスナーに設定します

于 2012-12-12T20:31:12.520 に答える
0

より良い実装は

private Thread dataThread = new Thread(new Runnable(){
public void run() {
    while(true){

    if(transmitPackets){
       Log.d("Test","DERP");
       transmitPackets = false;
    }
  }
}
});

そのようにスレッドは進み続け、実行されるように transmitPackets 値の真の値を変更するだけです

于 2012-12-12T20:38:25.133 に答える