2012-01-13 14 views
0

私はJavaを使い慣れていません。問題があります。私はAndroid用のチュートリアルからいくつかのコードをコピーしましたが、今はrun()メソッドに整数変数を渡したいので、ループごとにインクリメントして、バックグラウンドスレッド外にキャッチできます。どうすればいい?メソッドに変数を渡す(Java)

int gg= 0;  
Thread background = new Thread(new Runnable() { 
        public void run() { 
         try { 

          while (pBarDialog.getProgress() <= 100) { 

           Thread.sleep(100); 
           gg++; // the increment here 
           progressHandler.sendMessage(progressHandler 
             .obtainMessage()); 


          } 
          if (pBarDialog.getProgress() == 100) { 
           pBarDialog.dismiss(); 

          } 

         } catch (java.lang.InterruptedException e) { 
          // if something fails do something smart 
         } 
        } 

       }); 
      //catch gg here 
+0

変数を「キャッチ」することはどういう意味ですか? Btw、私はpBarDialog.dismiss()は、UIスレッド、つまりハンドラで呼び出す必要がありますと考えています。 – Ash

+0

私はそれを印刷することを意味するものをキャッチすることによって。 – ItsGreg

+0

内部クラスに渡したいものは "final"を使って行うことができます(ただし、変更したい場合は変数の値を別の変数にコピーする必要があります) – njzk2

答えて

3

run()メソッドに引数を指定することはできません。 int変数をフィールドとして宣言し、それを内部クラスで使用することができます。

public class TestActivity extends Activity 
{ 
    private volatile int no; 
    ..... 

} 

EDIT:(@alfからの提案)あなたは他のすべてのスレッドですぐに見ることができるフィールドので、変更された値でvolatilemodifierを使用することができます。

+5

注意:可視性。 – alf

+2

彼は揮発性を使用しなければならない、さもなければカウンター値は意味をなさない。 –

0
private volatile int gg; 

public void myMethod() { 
    Thread background = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      try { 
       while (pBarDialog.getProgress() <= 100) { 
        Thread.sleep(100); 
        gg++; // the increment here 
        progressHandler.sendMessage(progressHandler.obtainMessage()); 
       } 
       if (pBarDialog.getProgress() == 100) { 
        pBarDialog.dismiss(); 
       } 
      } catch (java.lang.InterruptedException e) { 
       // if something fails do something smart 
      } 
     } 

    }); 

    System.out.println(gg); 
} 
+2

最終変数は '++ 'できません。 – alf

+0

私はそれに問題は一度もなかった。私は私の答えを編集して、代替案を含めました。 –

+0

ggは最終的なのでthis.gg = ggを呼び出すことはできません。価値を変えることが目的なので、なぜあなたは最終決定を下すのですか? –

1

独自のクラスを持っており、そのコンストラクタを使用してカウンターを渡し、私はそれを試していないが、私はそのような何かを開始します:

class MyThread implements Runnable { 

    private volatile int counter; 

    public MyThread(int counter) { 
     this.counter = counter; 
    } 

    public void run() { 
    ... 
    } 

    public getCounter() { 
     return counter; 
    } 
} 

MyThread mt = new MyThread(10); 
Thread t = new Thread(mt); 
t.start(); 

// after some time 
t.getCounter(); 
+1

なぜ 'int'ではなく' Integer'を使うのですか?カウンタは揮発性であるか、常に同期ブロックからアクセスする必要があります。さもなければ、バックグラウンドスレッドが1000000に設定したとしても、メインスレッドは値として10を表示できます。 –

+0

@JBNizet私はそれを修正しました。私は自分の失敗を認識したように働く途中でした。 Fortunatly私は思っていたように私はそれほどひどく落としていませんでした。 – stacker

+0

@stackerはdownvoteを削除しました:) – alf

0

私があなただったら、私は思いますAtomicInteger、すなわちincrementAndGet()メソッドを調べてください。

フィールドが実際にスレッドにggからアクセスできるようになりますggを作り、そしてvolatileは変更、目に見えるを行いますが、あなたの意図が明確ではないので、私はあなたがインクリメント他のスレッドを持っていないことを確認することはできません同じ値:のアトミック性()がないので、複数のスレッドがgg++になるとすぐに間違った結果になる可能性があります。

関連する問題