ANDROID/Android 앱 프로그래밍
[Android] 핸들러(Handler)로 실행 지연시키기
주 녕
2021. 6. 21. 16:09
반응형
모든 내용은 Do it! 안드로이드 앱 프로그래밍을 바탕으로 정리한 것입니다.
일정 시간 후에 실행하기
응답이 늦어지거나 응답이 없으면 앱이 대기하고 있는 상황이 지속되는 문제 발생 → 별도의 스레드를 만들어 처리하게 됨
BUT 버튼 클릭으로 간단하게 접속 처리하는 경우에 메인 스레드 내에서 지연시간을 주는 것만으로도 UI 멈춤 현상을 방지할 수 있음
- Thread.sleep() 메서드로 대기 상태 만들기
- 핸들러(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();
}
}
* 핸들러(Handler)에 대한 자세한 내용은 아래 포스팅 참고!
반응형