스레드 - 작업스케줄링 :: 안드로이드 설치 및 개발[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

안드로이드 설치 및 개발
[1]
등록일:2018-08-21 09:50:15 (0%)
작성자:
제목:스레드 - 작업스케줄링
핸들러의 기본기능은 스레드간의 통신이지만 작업을 스케줄링하는데도 사용된다. 메시지큐는 선입선출의 원칙에 따라 운용되며 먼저 들어온 메시지가 우선적으로 처리되므로 큐에 작업들을 쌓아 놓으면 순차적으로 실행될 것이다, 메시지 큐가 작업의 목록과 순서를 관리해주는 것이다, 뿐만 아니라 메시지를 큐에 넣을 때 시간을 지정하여 원하는 때에 메시지를 원하는 때에 처리하도록 등록해 놓을 수도 있다.

boolean sendMessageAtTime (Message msg, long uptimeMills) // 절대시간지정 (부팅 후 경과시간)
boolean sendMessageDelayed (Message msg, long delayMills) // 상대시간지정 (현재 시간 기준)
시간의 단위는 1/1000초 이다. 

메시지와 동일하게 Runnable도 핸들러에게 전달하여 처리할 수 있다.
boolean postAtTime (Runnable r, long uptimeMills)
boolean postDelayed (Runnable r, long delayMills)


아래 하나의 예제를 살펴보자.
 
 public class UploadTest extends Activity implements View.OnClickListener {
 Button mUpload;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mUpload = (Button)findViewById(R.id.upload);
        mUpload.setOnClickListener(this);
    }
    
    public void onClick(View v) {
         switch(v.getId()) {
         case R.id.upload : 
             new AlertDialog.Builder(UploadTest.this)
             .setTitle("질문")
             .setMessage("업로드 하시겠습니까?")
             .setPositiveButton("예", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                    doUpload();
                 }
             })
             .setNegativeButton("아니오", null)
             .show();
             break;
       }
    }
    
    void doUpload() {
        for (int i = 0 ; i < 20 ; i++) {
           try { Thread.sleep(100); } catch (InterruptedException e) {;}
        }
        Toast.makeText(this, "업로드를 완료했습니다.", 0).show();
    }
}

버튼을 클릭시에 doUpload메소드가 호출되고 20 * 0.1 초 후 업로드가 완료되었다는 Toast메시지가 뜨게 된다.


여기서 문제가 하나 있다. 
Upload 버튼을 누른 후 대화상자가 나타나는데 여기서 "예"를 누르면 대화상자가 닫히고 업로드가 시작되어야 하는데 대화상자가 열려있는채로 doUpload 메소드가 호출되고 업로드가 완료되어야 대화상자가 닫히게 된다.
doUpload가 리턴을 안하고 잡고 있기 때문에 화면을 다시 그릴 기회조차 없는 것이다.

이 문제를 해결하려면 방금 전에 알아본 sendEmptyMessageDelayed 메소드를 사용하면 되는데 doUpload메소드 호출을 메시지 큐에 나중에 실행되게 넣어놓고 그 틈에 대화상자를 닫는 것이다. 그러면 대화상자가 닫히고 doUpload메소드가 호출되게 된다. 

 
 public class UploadTest extends Activity implements View.OnClickListener {
 Button mUpload;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mUpload = (Button)findViewById(R.id.upload);
        mUpload.setOnClickListener(this);
    }
    
    public void onClick(View v) {
        switch(v.getId()) {
        case R.id.upload : 
            new AlertDialog.Builder(UploadTest.this)
            .setTitle("질문")
            .setMessage("업로드 하시겠습니까?")
            .setPositiveButton("예", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog, int whichButton) {
                      mHandler.sendEmptyMessageDelayed(0, 10);
                 }
            })
            .setNegativeButton("아니오", null)
            .show();
            break;
        }
    }
    
    Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            if(msg.what == 0) {
               doUpload();
            }
        }
    };
    
    void doUpload() {
         for (int i = 0 ; i < 20 ; i++) {
             try { Thread.sleep(100); } catch (InterruptedException e) {;}
         }
        Toast.makeText(this, "업로드를 완료했습니다.", 0).show();
    }
 }

이제 대화상자에서 "예"를 누르면 대화상자가 닫히고 doUpload 메소드가 호출되는 걸 확인 할 수 있다.

출처: http://babtingdev.tistory.com/277?category=303788 [밥팅우기's Log]
[본문링크] 스레드 - 작업스케줄링
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34795
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.