ANDROID/Android 앱 프로그래밍

[Android] 핸들러(Handler)로 실행 지연시키기

주 녕 2021. 6. 21. 16:09
반응형

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 

 

일정 시간 후에 실행하기

응답이 늦어지거나 응답이 없으면 앱이 대기하고 있는 상황이 지속되는 문제 발생 → 별도의 스레드를 만들어 처리하게 됨

BUT 버튼 클릭으로 간단하게 접속 처리하는 경우에 메인 스레드 내에서 지연시간을 주는 것만으로도 UI 멈춤 현상을 방지할 수 있음

  1. Thread.sleep() 메서드로 대기 상태 만들기
  2. 핸들러(Handler)로 지연 시간 발생시키기

💡 핸들러로 지연시간을 주는 경우, 핸들러로 실행되는 코드는 메시지 큐(Message Queue)를 통과하면서 순차적으로 실행되므로 UI 객체들에 영향을 주지 않으면서 지연 시간을 두고 실행됨

 

  • postDelayed() 메서드를 사용하여 지정한 시간이 지난 후 코드가 실행됨
  • 핸들러는 메시지 큐를 사용하기 때문에 메시지들을 순서대로 처리하지만, 시간을 지정하면 원하는 시간에 처리하게 할 수 있음
  • 핸들러의 sendMessage() 메서드와 유사한  sendMessageAtTime() sendMessageDelayed() 메서드를 사용할 수 있음
    • sendMessageAtTime() :  메시지를 보낼 때 시간을 지정
    • sendMessageDelayed() : 메시지가 일정 시간이 지난 후 실행되도록 설정
  • Runnable 객체를 실행할 때도 post()메서드와 유사한 postAtTime()postDelayed() 메서드를 사용할 수 있음
public class DelayActivity extends AppCompatActivity {

    TextView textView;
    Handler handler = new Handler();

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

        textView = findViewById(R.id.response_textview);

        Button button = findViewById(R.id.request_btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                requset();
            }
        });
    }

    private void requset() {
        String title = "원격 요청";
        String message = "데이터를 요청하시겠습니끼?";
        String titleButtonYes = "예";
        String titleButtonNo = "아니오";
        AlertDialog dialog = makeRequestDialog(title, message, titleButtonYes, titleButtonNo);
        dialog.show();

        textView.setText("다이얼로그 표시중...");
    }

    private AlertDialog makeRequestDialog(CharSequence title, CharSequence message,
                                          CharSequence titleButtonYes, CharSequence titleButtonNo) {
        AlertDialog.Builder requestDialog = new AlertDialog.Builder(this);
        requestDialog.setTitle(title);
        requestDialog.setMessage(message);
        requestDialog.setPositiveButton(titleButtonYes, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                textView.setText("5초 후에 결과 표시됨");
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("요청 완료됨.");
                    }
                }, 5000);
            }
        });

        requestDialog.setNegativeButton(titleButtonNo, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

            }
        });

        return requestDialog.create();
    }
}

 

지연시키기.gif

 

 

 

* 핸들러(Handler)에 대한 자세한 내용은 아래 포스팅 참고!

 

[Android] 핸들러(Handler)

모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다. 핸들러(Handler) 새로운 프로젝트를 만들면 자동으로 생성되는 메인 액티비티는 앱이 실행될 때 하나의 프로세스에서

junyoung-developer.tistory.com

 

반응형