0

すべての関数が定義されている Android Java プロジェクトにメイン クラスがあります。次に、メイン クラスを拡張して実装する 2 つの他のクラスがありますRunnable

  • メイン クラス: すべてのメイン関数
  • クラス 2: すべてのメイン関数を使用しX、ファイル 2 で変更する静的変数を持っています。
  • クラス 3: すべてのメイン関数を使用しY、ファイル 3 で変更する静的変数を持っています。

メイン クラスでは、Class2 用と Class3 用の 2 つのスレッドを開始します。

Class2.Xメインクラスから呼び出そうとすると、いつもnull何があってもです。volatilesynchronized(thread)、などを試しgetvalue()ましたが、機能しません。

Class2.Xメインクラスから null にならないように値を読み取るにはどうすればよいですか?

コードは次のとおりです。

Thread t = new Thread(new Functionss(mRgbImage));
t.start();
Thread t2 = new Thread(new Functionss_2(mRgbImage));
t2.start();

if(boolean_variable)
{
    try {
        Thread.sleep(30000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    Bitmap final_added =addition(mRgbImage2, mRgbImage3);                 
    mImageView.setImageBitmap(final_added);

mRgbImage2mRgbImage3static volatile変数です。

mImageView.setImageBitmap(initial_image)実際、メインクラスで画像を使用して変更してから実行すると、Androidフォンで黒い画面が表示されるため、変数の問題ではないと思います。

logcat で次の点に注意しました。

Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@40a34d28

スレッドを削除すると、このエラーは発生しません。

何か助けはありますか?

4

2 に答える 2

1

スレッドが割り当てステートメントを実行していないか、別の値または何かを割り当てていると思われます。いくつかのログ メッセージを入力するか、アプリケーションをデバッグして、割り当てにブレーク ポイントを配置すると役立つ場合があります。

次のようなものがあった場合:

public class MainClass {
    Class2 class2 = new Thread(new Class2());
    class2.start();
    class2.join();
    // Class2.value will == 10 here
}

その後:

public class Class2 implements Runnable {
    public static volatile int value;
    public void run() {
       ...
       this.value = 10;
       ...
    }
}

次に、割り当てが発生したClass2後、value 意志が更新されます。これは明らかに単純な例であり、コード内でスレッドが実際に終了していないと思われますClass2、割り当てに到達している限り変更されます。ここでも、ログ メッセージまたはデバッガが役立ちます。value

次のパターンのようなものを用意することをお勧めします。

public class Class2 implements Runnable {
    private volatile int value;
    public void run() {
       ...
       this.value = 10;
       ...
    }
    public int getValue() {
        return this.value;
    }
}

したがって、混乱することなくMainClass値にアクセスできますClass2。値が異なるスレッドから取得/設定されているためClass3、キーワードがまだ必要であることに注意してください。volatile

ここで何かが役立つことを願っています。質問を編集して詳細を記入していただければ、さらにお役に立てるかもしれません。

于 2012-04-09T21:49:55.953 に答える
0

私はJJILライブラリを使用していましたが、それが判明しました

「どの手順で問題を再現しますか?

  1. 複数のスレッドで同時に RgbImageJ2se.toDisplay を使用します (RgbImageJ2se の異なるインスタンス)。

渡された Graphics オブジェクトへの静的参照により、どのスレッドが最初に実行されるかによって結果が不確定になります。"

参考:http ://code.google.com/p/jjil/issues/detail?id=27

代わりに数学関数を使用してコードを書き直し、出力が正しかったため、ライブラリに関係があるのではないかと疑っていました。両方のクラスが終了し、出力を使用してさらに計算を行うのを待っていました。

これが他の誰かが立ち往生するのに役立つことを願っています。

于 2012-04-14T18:17:18.223 に答える