[Snippet]
일정 시간 후에 실행하기
#1 메인 스레드(UI 스레드)인 경우Handler().postDelayed(new Runnable() { @Override public void run() { //실행할 코드 } }, 1000);
#2 메인 스레드가 아닌 경우
메인 스레드가 아닌 곳에서 사용시 해당 스레드에서 looper가 구현되어 있지 않으면 위의 코드 실행시 아래와 같은 에러를 만나게 됩니다.
01-24 13:06:48.589 E 32489 32729 AndroidRuntime: FATAL EXCEPTION: Thread-4274
01-24 13:06:48.589 E 32489 32729 AndroidRuntime: Process: kr.happydev.snippettest, PID: 32489
01-24 13:06:48.589 E 32489 32729 AndroidRuntime: java.lang.RuntimeException: Cant create handler inside thread that has not called Looper.prepare()
이때는 Handler 객체 생성자의 인수로 looper를 구현해서 넣어주어야 합니다.
또는 메인 스레드의 루퍼를 사용할 경우는 아래와 같이 해주면 됩니다.
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { @Override public void run() { //실행할 코드 } }, 1000);
참고로 메인 스레드의 경우 #1 코드의 생성자 인수로 looper를 전달하지 않아도 RuntimeException이 발생하지 않는 것은 메인 스레드의 looper를 따로 생성하지 않아도 이미 존재하기 때문에 문제가 되지 않습니다.
[Sample]
#1 Back 키를 연속해서 두 번 누를 경우 종료하도록 처리하는 예
private boolean backKeyPressedTwice = false; @Override public void onBackPressed() { if (backKeyPressedTwice) { super.onBackPressed(); return; } backKeyPressedTwice = true; Toast.makeText(this, "Back 키을 한번 더 누르시면 종료됩니다", Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { backKeyPressedTwice = false; } }, 2000); }
(1) 처음에 Back 키를 누르면 backKeyPressedTwice 변수는 true, "Back 키를 한번 더 누르시면 종료됩니다" 토스트 발생
(2) 2초 후에 backKeyPressedTwice 변수는 false로 초기화하도록 생성한 Runnable 객체를 핸들러에 전달
(3-1) 2초 전에 Back 키를 한번 더 누르면 backKeyPressedTwice 변수는 아직 true이므로 super.onBackPressed()가 호출되면서 종료처리 됨
(3-2) 2초 후에 Back 키를 한번 더 누르면 (1)과 같이 실행됨
#2 일정 시간 후에 종료하도록 처리하는 예
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) { Toast.makeText(getApplicationContext(), "There is no camera flash.\n The app will finish!", Toast.LENGTH_LONG).show(); delayedFinish(); return; } ... } private void delayedFinish() { new Handler().postDelayed(new Runnable() { @Override public void run() { finish(); } }, 3000); }
앱 실행후 카메라 플래시 Feature가 존재하지 않는 경우 "There is no camera flash. The app will finish!" 문구의 토스트를 띄우고 토스트가 사라질 때쯤에 종료(finish)하도록 만든 것입니다.
위의 예는 아랫글에서 실제 사용하고 있는 코드입니다.
2018/10/15 - 손전등 앱 만들기 #3 - Flashlight API 이용방법 (Flashlight app using Flashlight API)
[실행결과]
'Android Dev > Snippets & Samples' 카테고리의 다른 글
Play 스토어 크롤링 - 앱 정보(이름, 버전) 가져오기 (0) | 2020.03.31 |
---|---|
화면 밝기 변경 (Change screen brightness) (0) | 2019.02.10 |
앱 진입시 스크린 리더(TalkBack, Voice Assistant) 감지하기 (0) | 2018.12.15 |
외부 전원 연결 / 헤드셋 연결 감지하기 (0) | 2018.11.18 |
애플리케이션 정보 (Application info.) 보기로 이동 (0) | 2018.11.02 |