User Interface Manipulation From UI Thread - 다른 스레드에서 UI 객체 접근하기
Android 2022. 2. 13. 12:39 |반응형
안드로이드 UI는 메인 스레드나 UI 스레드 외 다른 스레드에서 조작 할 수 없다. 다른 스레드에서 UI 조작 시 별다른 에러 없이 Virtual Device에서 잘 작동 되더라도 실제 기기에서는 종료되어 버린다. 아니면 테스트 시 Logcat에 아래와 같은 에러가 표시된다.
CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
위 예제의 경우 AVD에서는 별 이상없이 동작 하지만 실제 기기에서 버튼을 터치하면 바로 종료되어 버린다. 메인스레드나 UI 스레드가 아닌 다른 스레드에서 텍스트뷰에 접근하기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
MyThread thread = new MyThread();
thread.start();
}
});
}
class MyThread extends Thread {
@Override
public void run() {
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("My Thread.");
}
});
}
}
}
|
위와 같이 소스를 수정하고 빌드한다.
1
2
3
4
5
6
7
8
9
10
11
|
class MyThread extends Thread {
@Override
public void run() {
textView.postDelayed(new Runnable() {
@Override
public void run() {
textView.setText("My Thread");
}
}, 5000);
}
}
|
.post()가 아닌 .postDelayed()를 사용하면 Thread.sleep()를 사용하지 않고 일정시간 후 실행할 수 있다. 위 예제는 버튼 터치 5초 후 텍스트를 바꾼다.
다른 스레드에서 UI 스레드에 접근 하는 방법은 여러가지가 있다. 아래 링크를 참고하자.
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
반응형
'Android' 카테고리의 다른 글
Text To Speech 안드로이드 TTS (0) | 2022.02.14 |
---|---|
Message Passing with Thread 메인 스레드에서 다른 스레드로 메세지(데이터) 보내기 (0) | 2022.02.14 |
Google Android Maps SDK 구글 안드로이드 맵 (0) | 2022.02.12 |
Linux(Ubuntu) Database Server with PHP For Android App - 안드로이드 앱을 위한 리눅스(우분투) 데이터베이스 서버 (0) | 2022.02.09 |
Naver Reverse Geocoding For Android 안드로이드 네이버 리버스 지오코딩 (0) | 2022.02.06 |