게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
기초 질문! 안드로이드 내에서 스레드의 싱크 맞추기
게시물ID : programmer_10697짧은주소 복사하기
작성자 : 빙티
추천 : 0
조회수 : 698회
댓글수 : 10개
등록시간 : 2015/06/02 00:06:32
옵션
  • 창작글
  • 본인삭제금지
안녕하세요! 반도의 흔한 고딩입니다!!
제가 cursorThread라는 스레드를 새로 생성하였는데요,
이 스레드를 이용해 뷰의 위치를 이동시키는 것이 목적입니다.

뷰의 위치를 이동시키는 행위는 뷰를 생성시켰던 메인스레드 내부에서만 가능하다고 해서
스레드 내부에 메인 루퍼를 받아드리는 핸들러를 이용해 runnable을 post 함으로서 메인 스레드 내에서 연산이 되도록 하였습니다.

맨 아래의 코드에서 크고 굵은 글씨로 적힌 moveCursor(1,1)은
1
2
3
4
private void moveCursor(int x, int y){
    mParams.x += x;
    mParams.y += y;
}
cs
로 간단하게 x, y 인자 만큼 위치를 조절하려는 뷰의 패러미터인 mParams의 x, y 좌표를 조절합니다
이를 실행 시킨 후 윈도우매니져.updateViewLayout(이동시킬뷰, mParams); 를 통해 패라미터의 변화된 위치를 적용 시킵니다.

그런데 이게 스레드 연산속도만큼 moveCursor()를 실행시키다보니
스레드가 실행되자마자 뷰가 화면 구석으로 가버리더라구요 ㄷㄷ

그래서 Thread.sleep을 사용해서 주기를 늦추려고도 하였지만
Thread.sleep 실행시 로그 하나 띄우지 않은채 화면만 정지되는 현상(응답없음)이 벌어졌습니다 ㅠㅠㅠ


이게 사실 스레드 내 run함수 내부의 것들은
외부의 또다른 클래스인 CameraClass의 onCameraFrame이 호출될때만 그 주기에 맞춰서 실행 되면 되는것이거든요...
그런데 제가 스레드를 잘 이해를 못했는지, 어떻게 해야 할지 앞이 막막합니다 ㅠㅠ

현재는 어떻게 되고 있나면요
외부 또다른 클래스인 CameraClass내부의 액티비티의 onCameraFrame에서 변수k 계산 후 GlobalClass로 전달하구요
현재 cursorThread가 있는 이 액티비티가 실행되면 그 값을 아래 코드에 나와있는 cursorThread스레드가 받아오고요 그것을 이용해 moveCursor()하려고 합니다.... 참 비효율적이죠....


결론은 이것입니다.
이 cursorThread 스레드의 실행주기를 늦추거나
아님, 외부 클래스에 있는 함수와 실행주기를 맞추면 되는데
두 방법 중 어느 것을 택해는 것이 효율적이며, 
그러기 위해선 어떻게 해야 하는지 알고싶습니다!!!

답변 달아주시면 정말 감사드리겠습니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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(11);//뷰의 위치를 x+= 1, y+= 1 만큼 이동
                    mWindowManager.updateViewLayout(mCursorView, mParams);
                    /*try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }*/
                }
            });
            
        }
    }
});
cs





꼬릿말 보기
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호