2012-01-13 172 views
0

我是Java新手,遇到問題。我已經從Android的教程中複製了一些代碼,現在我想將一個整型變量傳遞給run()方法,所以我可以爲每個循環增加它,然後在後臺Thread之外捕獲它。我會怎麼做?將變量傳遞給方法(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

你是什麼意思'捕捉'變量?順便說一句,我相信應該在UI線程上調用pBarDialog.dismiss(),即在Handler中。 – Ash 2012-01-13 08:00:35

+0

通過捕捉我的意思是打印出來。 – ItsGreg 2012-01-13 08:02:59

+0

任何你想傳遞給內部類的東西都可以通過使用「final」來完成(但是如果你想修改它,那麼你必須將變量的值複製到另一個) – njzk2 2012-01-13 09:14:57

回答

3

您無法爲run()方法指定參數。您可以將int變量聲明爲field,並在內部類中使用它。

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

} 

編輯:(建議從@alf)可以使用volatilemodifier與字段,以便改變的值可以立即被所有其他線程可見。

+5

注意最好是「volatile」來確保能見度。 – alf 2012-01-13 08:05:20

+2

他必須使用volatile,否則計數器值沒有意義。 – 2012-01-13 08:17:07

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 2012-01-13 08:03:58

+0

我從來沒有遇到過問題。我編輯了我的答案,以包含替代方案。 – 2012-01-13 08:06:22

+0

調用this.gg = gg將不起作用,因爲gg是final。爲什麼你要完成它,因爲目標是要改變它的價值? – 2012-01-13 08:09:43

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

爲什麼使用Integer而不是int?計數器應該是易失性的,或者應該始終從一個同步塊中訪問。否則,主線程可能會看到10作爲值,即使後臺線程將其設置爲1000000. – 2012-01-13 08:10:26

+0

@JBNizet感謝我修復了它,因爲我認識到了我的失敗,所以我正在上班的路上。幸運的是,我並沒有像我想的那樣嚴重低調。 – stacker 2012-01-13 09:01:10

+0

@stacker刪除了downvote :) – alf 2012-01-13 09:03:10

0

如果我是你,我會正在調查AtomicInteger,即incrementAndGet()方法。

製作gg場的確會給線程訪問gg,並volatile將進行更改可見,但因爲你的意圖是不明確的,我不能確保你沒有其他線程遞增相同的值:你沒有原子性,,所以只要你有多個線程在做gg++,你很可能會得到錯誤的結果。