마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

스레드와 외부 클래스 내 실행되는 함수의 싱크를 맞추고 싶습니다!! [closed]

0 추천
안녕하세요! 반도의 흔한 고딩입니다!!
제가 cursorThread라는 스레드를 새로 생성하였는데요,
이 스레드를 이용해 뷰의 위치를 이동시키는 것이 목적입니다.
 
뷰의 위치를 이동시키는 행위는 뷰를 생성시켰던 메인스레드 내부에서만 가능하다고 해서
스레드 내부에 메인 루퍼를 받아드리는 핸들러를 이용해 runnable을 post 함으로서 메인 스레드 내에서 연산이 되도록 하였습니다.
 
 
맨 아래에서 크고 굵은 글씨로 적힌 moveCursor(1,1)은
 
private void moveCursor(int x, int y){
    mParams.x += x;
    mParams.y += y;
}
로 간단하게 x, y 인자 만큼 위치를 조절하려는 뷰의 패러미터인 mParams의 x, y 좌표를 조절합니다
이를 실행 시킨 후 윈도우매니져.updateViewLayout(이동시킬뷰, mParams); 를 통해
패라미터의 변화된 위치를 적용 시킵니다.
 
 
그런데 이게 스레드 연산속도만큼 moveCursor()를 실행시키다보니
스레드가 실행되자마자 뷰가 화면 구석으로 가버리더라구요 ㄷㄷ
 
그래서 Thread.sleep을 사용해서 주기를 늦추려고도 하였지만
Thread.sleep 실행시 로그 하나 띄우지 않은채 화면만 정지되는 현상(응답없음)이 벌어졌습니다 ㅠㅠㅠ
 
 
이게 사실 스레드 내 run함수 내부의 것들은
외부의 또다른 클래스인 CameraClass의 onCameraFrame이 호출될때만 그 주기에 맞춰서 실행 되면 되는것이거든요...
그런데 제가 스레드를 잘 이해를 못했는지, 어떻게 해야 할지 앞이 막막합니다 ㅠㅠ
 
현재는 어떻게 되고 있나면요
외부 또다른 클래스인 CameraClass내부의 액티비티의 onCameraFrame에서 변수k 계산 후 GlobalClass로 전달하구요
현재 cursorThread가 있는 이 액티비티가 실행되면 그 값을 아래 코드에 나와있는 cursorThread스레드가 받아오고요 그것을 이용해 moveCursor()하려고 합니다.... 참 비효율적이죠....
 
 
결론은 이것입니다.
 
이 cursorThread 스레드의 실행주기를 늦추거나
아님, 외부 클래스에 있는 함수와 실행주기를 맞추면 되는데
두 방법 중 어느 것을 택해는 것이 효율적이며, 
그러기 위해선 어떻게 해야 하는지 알고싶습니다!!!
 
답변 달아주시면 정말 감사드리겠습니다!
 
아래는 전체 코드입니다!!!
cursorThread = new Thread(new Runnable() {
    public void run() {
        while (!(cursorThread.isInterrupted())) {
            new Handler(Looper.getMainLooper()).post(new Runnable() { // new Handler and Runnable
                @Override
                public void run() {
                    if(global.getMove(true) != 0 && global.getMove(false) != 0){
                        Log.d("MOVE", "x = "+(int)(global.getMove(true)/2)+", y = "+(int)(global.getMove(false)/1));
                    }
                    moveCursor(1, 1);//뷰의 위치를 x+= 1, y+= 1 만큼 이동
                    mWindowManager.updateViewLayout(mCursorView, mParams);
                    /*try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }*/
                }
            });
            
        }
    }
});

 

 

 

질문을 종료한 이유: 해결했습니다! Timer를 사용하여 코딩하였습니다! 감사합니다!
레비튼 (320 포인트) 님이 2015년 6월 2일 질문
레비튼님이 2015년 6월 2일 closed
...