2014-12-01 8 views
0

runnable을 재사용하여 가비지 생성을 피하려고합니다. 그러나이 올바르게 구현하는 방법에 붙어있다.handler.postDelayed()에 대한 Runnable 재사용

은 여기 내 실행 가능한 래퍼 클래스입니다 :

public class RotateRunnable implements Runnable { 

    Maze maze; 
    int i; 
    int steps; 
    int originalAngle; 
    int dir; 

    public RotateRunnable(Maze maze) { 
     this.maze = maze; 
    } 

    public void setRunnable(int i, int steps, int originalAngle, int dir) { 
     this.i = i; 
     this.steps = steps; 
     this.originalAngle = originalAngle; 
     this.dir = dir; 
    } 

    @Override 
    public void run() { 
     maze.setIsRotateRunning(true); 
     maze.setAngle(originalAngle + dir*(90*(i+1))/steps); 
     maze.rotateStep(); 
    } 

} 

그리고 여기에 내가 그것을 구현 한 곳이다 :

private void smoothAnimateRotate(final int i, final int steps, final int originalAngle, final int dir) { 
//  handler.postDelayed(new Runnable() { 
//   @Override 
//   public void run() { 
//    isRotateRunning = true; 
//    angle = originalAngle + dir*(90*(i+1))/steps; 
//    rotateStep(); 
//   } 
//  }, 25 * (i)); 
     rotateRunnable.setRunnable(i, steps, originalAngle, dir); 
     handler.postDelayed(rotateRunnable, 25 * i); 
    } 

주석 처리 된 부분은 코드를 노력하고 있습니다. 내가 실행중인 문제는 postDelay()이 호출되기 전에 변수를 rotateRunnable 안에 설정하는 것입니다. 지금은 작동하지 않습니다. rotateRunnable은 설정된 마지막 변수 만 실행하는 것 같습니다. 이는 smoothAnimateRotate()이 변수를 매우 빠르게 업데이트하는 for-loop 내에서 실행되기 때문입니다.

run 메서드의 변수 부분을 어떻게 설정하여 나중에 run이 실행될 때 올바르게 설정 된 변수로 실행되도록합니까?

답변

2

실제로 handler.postDelayed 메서드를 호출하면 MessageQueue에 메시지를 밀어 넣고 실행 가능한 개체로 메시지의 콜백을 설정합니다. 설명에서, for 루프 내에서 smoothAnimateRotate 메소드를 매우 빨리 호출 했으므로 매우 짧은 시간 (25ms 미만) 만 걸릴 수 있습니다. 따라서 messageQueue가 폴링 메시지를 시작하고 rotateRunnable을 실행하면 설정된 마지막 변수 만 실행합니다. ArrayList를의 크기가 무한 증가 시키십시오을 방지하기 위해

당신이}} 아래

public class RotateRunnable implements Runnable { 

public static int index = 0; 
public static ArrayList<RotateNode> rotateNodeList = new ArrayList<RotateNode>(); 

Maze maze; 
int i; 
int steps; 
int originalAngle; 
int dir; 

public RotateRunnable(Maze maze) { 
    this.maze = maze; 
} 

public void setRunnable(int i, int steps, int originalAngle, int dir) { 
    RotateNode node = new RotateNode(); 
    node.i = i % 100; 
    node.steps = steps; 
    node.originalAngle = originalAngle; 
    node.dir = dir; 
    rotateNodeList.add(i % 100, node); 
} 

@Override 
public void run() { 
    RotateNode node = rotateNodeList.get(index % 100); 
    maze.setIsRotateRunning(true); 
    maze.setAngle(node.originalAngle + node.dir*(90*(node.i+1))/node.steps); 
    maze.rotateStep(); 
    index ++; 

} 

처럼 모든 변수를 캐시

public class RotateNode { 
int i; 
int steps; 
int originalAngle; 
int dir; 

을의 ArrayList 객체를 할당 할 수 있습니다, 난 회전 애니메이션 가정 1 원당 100 걸음, 원마다 단계 수를 바꿀 수 있습니다. 희망이 있습니다.