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

안드로이드에서 스레드 sleep() 메소드를 써보려고 하는데, 생각대로 잘 안됩니다.

0 추천

안드로이드에서 스레드 sleep() 메소드를 써보려고 하는데, 생각대로 잘 안됩니다.

9x9 크기의 TextView에 숫자를 채우되, 0.1초마다 한칸씩 채우려고 합니다.

다음과 같이 코드를 작성하였습니다.

package com.example.testfortest;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    TextView[][] basicCell=new TextView[9][9];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initVar();

        int cnt=0;
        for(int i=0; i<9; i++){
            for(int j=0; j<9; j++){
                basicCell[i][j].setText(j+"");
                basicCell[i][j].setTextColor(Color.BLACK);
                basicCell[i][j].setTextSize(20);
                basicCell[i][j].setGravity(Gravity.CENTER);

                try{
                    Thread.sleep(100);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }

                Log.d("COUNT", ""+cnt++);
            }
        }
    }
}

TextView[][] basicCell=new TextView[9][9];

를 만들어서, 각 텍스트뷰를 전부 연결시켰습니다.

기대되는 결과 화면은 다음과 같습니다.

코드 중간에 

try{  Thread.sleep(100);  }

catch (InterruptedException e) { }

를 삽입해서, 

숫자가 0.1초마다 하나씩 나오게 하려고 했습니다만...

 

어플을 실행하면, 몇 초동안 가만히 있다가 숫자들이 한꺼번에 나옵니다.

로그를 찍어서 살펴봤는데, 

Log.d("COUNT", ""+cnt++);

로그챗에서는 열심히 로그를 찍으며 돌아가는데,

화면은 몇 초동안 먹통상태에 있다가,

cnt가 80이 딱 되니까, 화면에 숫자들을 한꺼번에 표시했습니다.

 

에뮬레이터 렉인가 싶어, 제 스마트폰으로도 돌려봤는데, 결과는 똑같더군요.

뭐가 문제인지 모르겠습니다.

 

의도한대로 결과를 볼 수 있는 방법이 있을까요?

(코드 전체를 올리고 싶은데, 글 길이 제한 때문에 안올라가네요. ㅠ)

라춘자 (400 포인트) 님이 2018년 3월 7일 질문
라춘자님이 2018년 3월 7일 수정

2개의 답변

+1 추천
 
채택된 답변
main Thread에서 sleep을 하셔서 , UI 그리는 것도 sleep 이 되서 그렇습니다.

아래 코드는 Handler로 변경한 코드입니다.

머리로만 적은거라..  제대로 될지는 모르겠네요.. 참조만 하세요..^^;;

package com.example.testfortest;
 
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.TextView;
 
public class MainActivity extends AppCompatActivity {
    TextView[][] basicCell=new TextView[9][9];
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        initVar();
        handler.sendMessageDelayed(manifestRefreshHandler.obtainMessage(0/*이벤트 번호*/,0 /* i 시작 값*/,0 /*j 시작값*/), 100 /* 100ms 이후 수행 */);
    }

    final Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg)
      {
         if(msg.what == 0) { /*이벤트 번호가 0일 때 수행*/,
            basicCell[msg.arg1][msg.arg2].setText(msg.arg2+"");
            basicCell[msg.arg1][msg.arg2].setTextColor(Color.BLACK);
            basicCell[msg.arg1][msg.arg2].setTextSize(20);
            basicCell[msg.arg1][msg.arg2].setGravity(Gravity.CENTER);

            msg.arg2++;
            if(msg.arg2 >= 9){
              msg.arg2 = 0;
              msg.arg1++;
            } // for문 규칙에 맞춰 i, j 값 올림

            if(msg.arg1 < 9) { // i 가 9 이하일 때 반복 수행
               handler.sendMessageDelayed(manifestRefreshHandler.obtainMessage(0,msg.arg1,msg.arg2), 100);
            }
         }
      }
    }
}
익명사용자 님이 2018년 3월 8일 답변
라춘자님이 2018년 4월 12일 채택됨
친절한 답변 너무 감사합니다!
+1 추천

Thread쪽 제대로 코딩하려면 생각보단 쉽지 않아요

Thread, Handler 검색하셔서 많이 공부하셔야될거에요

 

http://itpangpang.xyz/279?category=563138

링크 누르셔서 내리시다 보면 1초마다 메인스레드와 작업스레드 통신 부분 있는데

이 코드 변형하셔서 하시면 될 거 같네요. 내용 길지 않아서 다 보셔도 될듯..

 

스레드 멈추는 방법은 while(true) 여기를

while(boolean 변수) 해서 칸을 다 채우면 변수값을 false로 바꾸는 식으로 하시면 됩니다.

 

익명사용자 님이 2018년 3월 8일 답변
감사합니다. 이 참에 스레드 부분 공부 좀 확실히 하고 가야겠네요.
...