@Jusit は、グローバル オブジェクトを使用してバックグラウンド スレッドからアクティビティにデータを渡すことを提案しましたが、それは機能しました。しかし今、私はデッドロックについて心配しており、それを回避/防止する良い方法があるかどうか. また、グローバル オブジェクトとしての String の選択が適切かどうかもわかりません。これが私が現在行っていることの説明です。
実際には、グローバル オブジェクトは、以下に示すように、Blueterm.java で作成された public static 変数にすぎません。
public class BlueTerm extends Activity {
// a global object I guess
public static String strData = "";
// a couple of booleans to control reads/writes
public static boolean strWrite = false;
public static boolean strRead = false;
...
}
したがって、strData は、次のようにバックグラウンド スレッドによって作成および書き込まれるグローバル オブジェクトであると思います。
while (BlueSentry.strRead == true);
BlueSentry.strWrite = true;
BlueSentry.strData = BlueSentry.strData + Character.toString(printableB);
BlueSentry.strWrite = false;
私の意図は、プロット アクティビティが読み取り中に strData が上書きされるのを防止するために strRead を使用することです。strWrite は、次のように書き込まれている間、プロット アクティビティが strData を読み取らないようにします。
while (BlueSentry.strWrite == true);
BlueSentry.strRead = true;
String strData = BlueSentry.strData;
BlueSentry.strData = "";
BlueSentry.strRead = false
プロット アクティビティがそれを読み取った後、strData が空の文字列にリセットされることがわかります。
携帯電話が USB でデバッグに接続されていないときに強制終了が発生したため、強制終了の原因がわかりません。それ以来、それは起こっていません。
ここでデッドロックなしで同時実行を達成するための提案はありますか? 相互排除 (セマフォ、ロック、ミューテックス) について読んだことがありますが、どれを使用すればよいかわかりません。また、リアルタイムのデータ転送が必要なため、グローバル オブジェクトとして String を選択したのはおそらく悪いことです。つまり、アクティビティが読み取りを完了するのを待ってスレッドをブロックしたくありません。また、バックグラウンド スレッドが書き込みを完了するのを待ってアクティビティをブロックしたくありません。String を取り除き、代わりに FIFO バッファを実装/使用する必要がありますか?