2016-08-06 3 views
0

내가하고 싶은 것은 다른 변수를받을 수 있도록 run() 메서드를 변경하는 것입니다. 내가 사용할 수 있도록 player1life를 다른 것으로 변경하고 싶습니다. customHandler.postDelayed (updateTimerThread, 0);은 다른 하나 (예 : player2life)에 있습니다. 코드는 버튼이 눌려지면 변수가 값을 변경합니다.Runnable에서 메소드의 변수를 변경하는 방법은 무엇입니까?

참고 : 저는 완전히 안드로이드 개발의 초보자입니다.

내가 XY 문제를 냄새
final android.os.Handler customHandler = new android.os.Handler(); 
    final Runnable updateTimerThread = new Runnable() 
    { 
     public void run() 
     { if(pressed) { 
      player1life--; 
      textView.setText(String.valueOf(player1life)); 
      customHandler.postDelayed(this, 100); 
     } 
     } 
    }; 


    leftButton1.setOnTouchListener(new View.OnTouchListener() { 

     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 


      switch (motionEvent.getAction()){ 
       case MotionEvent.ACTION_DOWN : 
        pressed = true; 
        customHandler.postDelayed(updateTimerThread, 0); 
        leftButton1.setImageResource(R.drawable.arrownewred); 
        winFunction(); 
        break; 
       case MotionEvent.ACTION_UP : 
        pressed = false; 
        leftButton1.setImageResource(R.drawable.arrownew); break; 
      } 
      return true; 
     } 
    }); 

답변

1

...

player2life을 처리하기위한 다른 Runnable을 만들 수 없습니다? 클릭 핸들러에서 if 문을 사용하여 어떤 플레이어의 생명을 감소시켜야하는지 확인하십시오!

if ... { 
    customHandler.postDelayed(runnableThatHandlesPlayer1Life, 0); 
} else { 
    customHandler.postDelayed(runnableThatHandlesPlayer2Life, 0); 
} 

그리고보다 Runnable은 이런 식으로 선언 할 수 있습니다 :

final Runnable runnableThatHandlesPlayer1Life = new Runnable() 
{ 
    public void run() 
    { if(pressed) { 
     player1life--; 
     textView.setText(String.valueOf(player1life)); 
     customHandler.postDelayed(this, 100); 
    } 
    } 
}; 

final Runnable runnableThatHandlesPlayer2Life = new Runnable() 
{ 
    public void run() 
    { if(pressed) { 
     player2life--; 
     textView.setText(String.valueOf(player2life)); 
     customHandler.postDelayed(this, 100); 
    } 
    } 
}; 

을하지만 당신의 코드 종류의 의심이다. 귀하의 코드를 이해함으로써 버튼 1을 누르면 플레이어 1의 수명이 10 초/초로 감소합니다. 이상합니다.

타이머를 만들려는 것처럼 보입니다. 내가 작성한이 Timer 클래스를 시도해보십시오.

import android.os.Handler; 

public class Timer { 
    private Handler handler; 
    private boolean paused; 

    private int interval; 

    private Runnable task = new Runnable() { 
     @Override 
     public void run() { 
      if (!paused) { 
       runnable.run(); 
       Timer.this.handler.postDelayed (this, interval); 
      } 
     } 
    }; 

    private Runnable runnable; 

    public int getInterval() { 
     return interval; 
    } 

    public void setInterval(int interval) { 
     this.interval = interval; 
    } 

    public void startTimer() { 
     paused = false; 
     handler.postDelayed (task, interval); 
    } 

    public void stopTimer() { 
     paused = true; 
    } 

    public Timer (Runnable runnable, int interval, boolean started) { 
     handler = new Handler(); 
     this.runnable = runnable; 
     this.interval = interval; 
     if (started) 
      startTimer(); 
    } 
} 
1

이 문제가 단지 익명의 내부 클래스의 final 변수의 필요성 과거지고 있습니다 : 그것은 좀 더 쉽게 일을해야한다? 그렇다면 길이 1의 최종 배열을 사용하고 배열 요소를 업데이트하는 "트릭"을 사용할 수 있습니다.

public interface Incrementer { 

    void increment(); 

} 

public class Foo { 

    private int bar = 0; 

    public int getBar() { 
     return bar; 
    } 

    public void increment() { 
     this.bar++; 
     System.out.println("value is now: " + bar); 
    } 


} 

public class Closure { 

    public static void main(String[] args) { 

     System.out.println("hello"); 
     Foo foo1 = new Foo(); 
     Foo foo2 = new Foo(); 

     final Foo[] theFoo = {foo1}; 

     Incrementer incrementer = new Incrementer() { 

      public void increment() { 
       theFoo[0].increment(); 

      } 

     }; 

     incrementer.increment(); 
     incrementer.increment(); 
     incrementer.increment(); 
     theFoo[0] = foo2; 
     incrementer.increment(); 
     incrementer.increment(); 
     System.out.println("foo1 = " + foo1.getBar()); 
     System.out.println("foo2 = " + foo2.getBar()); 

    } 

} 
: 여기

간단한 예는
관련 문제