2012-01-13 173 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++,你很可能会得到错误的结果。