2012-04-09 3 views
0

私はすべての機能が定義されているAndroidのJavaプロジェクトでメインクラスを持っています。次に、メインクラスを拡張してRunnableを実装する2つのクラスがあります。Windowsは既に焦点を当てている - 複数のスレッドの後でフォーカスを無視する

  • メインクラス:すべての主要な機能
  • がクラス2:私は、すべての主要な機能を使用して、私は、ファイル内の2
  • クラス3変更静的変数X持っている:私はすべての主要な機能を使用して持っているが静的変数Yをファイル3で修正しました。

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

メインクラスからClass2.Xに電話をかけようとすると、何時でもnullになります。私はvolatilesynchronized(thread)getvalue()などを試しましたが、動作しません。

Class2.Xの値がメインクラスからヌルでないように読むにはどうすればよいですか?ここで

はコードです:

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: [email protected] 

私はスレッドを削除すると、私はこのエラーを得ることはありません。

助けが必要ですか?

+2

いくつかのコードを表示できますか?問題のフィールドの定義を表示できますか?私はあなたが "クラス"を意味すると思うとき、あなたは単語 "ファイル"を使用します、そうですか? – Gray

+0

はい、すべてのファイルがクラスを定義しています。 – Adroidist

+0

'boolean_variable'を' false'にできますか?それはwhileループか何かでなければならない。 'while(!boolean_variable){sleep(1000); } 'または何か? – Gray

答えて

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が混乱なくClass2Class3から値にアクセスできます。値が別のスレッドから取得/設定されているため、依然としてvolatileというキーワードが必要であることに注意してください。

ここに何かが役立ちます。あなたが詳細を編集して質問を編集すると、私はもっと助けることができるかもしれません。

+0

Hey Gray、コードを投稿しましたが、静的変数の問題ではないかもしれません。 – Adroidist

+0

申し訳ありません@Adroidist、私は考えがありません。私はあなたの元の質問が問題だとは思わない。画像が表示されている場所でコードをデバッグしたり、更新されたかどうかを確認するログメッセージを追加できますか? – Gray

+0

下記の私の答えをチェックしてください – Adroidist

0

私はJJILライブラリを使用していたし、それが問題を再現しますどのような手順その

「 判明?

  1. 使用RgbImageJ2se.toDisplay multiipleスレッドsimulatenous(RgbImageJ2seの異なるインスタンス)で。

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

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

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

これは、誰かが立ち往生するのに役立ちます。