본문 바로가기
Front-end/Android (안드로이드 앱 개발)

Android Studio , Thread & Handler (쓰레드와 핸들러), 오래걸리는 작업, 쓰레드 이용하여 화면에 뿌릴 때

by javapp 자바앱 2020. 7. 18.
728x90

 

public class MainActivity extends AppCompatActivity {
    TextView
text1;
    TextView
text2;

   
boolean isRunning = false;
   
//화면 처리용 핸들러
   
DisplayHandler handler;
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView(R.layout.
activity_main);

       
text1 = findViewById(R.id.textView);
       
text2 = findViewById(R.id.textView2);

       
isRunning = true;
       
handler = new DisplayHandler();

       
//오래걸리는 쓰레드로 보낸다.
       
Runnable runnable =new Runnable(){
           
@Override
           
public void run(){
               
while(isRunning)//오래걸리는 작업으로 가정
               
{
                    SystemClock.sleep(
1000);
                   
long now = System.currentTimeMillis();
                    Log.d(
"test", ""+now/1000*60*60);
                   
//화면에 관련된 작업은 핸들러로 옮긴다. (7버전이하는 오류발생)
                   
handler.sendEmptyMessage(0);    //작업 구분
                   
SystemClock.sleep(1000);
                    
handler.sendEmptyMessage(1);    //작업 구분, msg 인자
                   
SystemClock.sleep(1000);

                   
//핸들러 화면처리를 위한 데이터 전달 , 정수 2 (arg1,arg2) 객체 1 (obj)
                   
Message msg = new Message();
                    msg.
what = 2;
                    msg.
arg1 = 1;
                    msg.
arg2 = 2;
                    msg.
obj = now;          //모든 형식 가능
                   
handler.sendMessage(msg);
                }
            }
        };
        Thread thread =
new Thread(runnable);
        thread.start();
    }


   
//개발자가 발생시킨 쓰레드에서부터 화면에 관련된 처리를 하귀 위해 작업 요청시 사용
   
//자동으로 호출되는 메서드(메인 쓰레드가 발생)
    //
오래걸리는 작업은 안된다.
   
class DisplayHandler extends Handler
    {
       
@Override
       
public void handleMessage(@NonNull Message msg) {
           
super.handleMessage(msg);

           
switch (msg.what)
            {
               
case 0:
                   
text2.setText("핸들러 1"); //화면 작업
                   
break;
               
case 1:
                   
text2.setText("핸들러 2");
                   
break;
               
case 2:
                   
text2.setText(msg.arg1+ " "+msg.arg2 +" "+ msg.obj);
                   
break;
            }

        }
    }


   
public void btnMethod(View view){
       
long now = System.currentTimeMillis();
       
text1.setText("clicked: "+now/1000*60*60);
    }

   
@Override
   
protected void onDestroy() {
       
super.onDestroy();
       
isRunning = false;
    }

}

댓글