2012-01-13 3 views
0

저는 Java를 처음 사용하는데 문제가 있습니다. 안드로이드에 대한 튜토리얼에서 코드를 복사했는데 이제 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; 
    ..... 

} 

편집 : (@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 내가 생각했던 것처럼 크게 downvoted되지 않았습니다. – stacker

+0

@stacker가 downvote를 삭제했습니다 :) – alf

0

내가 당신이라면,이 좋겠 AtomicInteger, 즉 incrementAndGet() 방법을 조사하고 있어야합니다.

필드가 실제로 스레드를gg-액세스 권한을 부여합니다 gg 만들기 및 volatile는 변경 , 볼을하지만 당신의 의도가 명확하지 않기 때문에, 나는 당신이 증가 다른 스레드가없는 것을 확신 할 수 없다 같은 값 : 원자도,이 없으므로 하나 이상의 스레드가 gg++ 일 때마다 잘못된 결과가 발생할 가능성이 높습니다.

관련 문제