0

@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 バッファを実装/使用する必要がありますか?

4

1 に答える 1

3

バックグラウンド スレッドからアクティビティに移行する場合は、ハンドラー ( http://developer.android.com/reference/android/os/Handler.htmlを参照) を通信手法として使用します。簡単なチュートリアルについてはhttp://www.tutorialforandroid.com/2009/01/using-handler-in-android.htmlを参照してください。

  1. Character.toString(printableB)メッセージの値を受け取るアクティビティでハンドラを作成します。
  2. Handler をバックグラウンド スレッドに渡します。
  3. バックグラウンド スレッドは、更新のたびにメッセージを Handler に送信します。
  4. Handler が呼び出され、Activity のスレッドで必要な変更を行います。

グローバルに共有される変数はなく、読み取り/書き込みエラーの可能性もなく、誰もが満足して家に帰ります。

于 2011-05-29T14:39:53.167 に答える