문제상황
서버에서 200으로 데이터를 성공적으로 보냈는데 안드로이드에서 데이터가 출력되지 않는다.
rocess: com.example.connect, PID: 10776
android.view.ViewRootImpl$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its views.
Expected: main Calling: OkHttp http://myipaddress:5000/...
ChatGPT의 답변
이 문제는 UI 업데이트를 메인 스레드가 아닌 백그라운드 스레드에서 시도하여 발생한 것으로 안드로이드의 경우 메인 스레드가 아닌 곳에서 UI 요소를 직접 수정할 수 없다.
해결법으로는 OkHttp의 onResponse() 메서드에서 UI업데이트를 메인스레드에서 수행하도록 한다. runOnUiThread()메서드를 사용하여 UI업데이트 작업을 메인 스레드로 이동시킨다.
<수정 전_error>
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
runOnUiThread(() -> {
Toast.makeText(getApplicationContext(), "서버 응답 실패", Toast.LENGTH_SHORT).show();
return;
try {
String result = Objects.requireNonNull(response.body()).string();
runOnUiThread(() -> {
// UI 업데이트를 메인 스레드에서 실행
imageView.setText(result);
} catch (IOException e) {
e.printStackTrace();
runOnUiThread(() -> {
Toast.makeText(getApplicationContext(), "응답 처리 실패", Toast.LENGTH_SHORT).show();
<수정 후_error 해결!>
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
runOnUiThread(() -> {
Toast.makeText(getApplicationContext(), "서버 응답 실패", Toast.LENGTH_SHORT).show();
return;
try {
final Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());
runOnUiThread(() -> {
// UI 업데이트를 메인 스레드에서 실행
imageView.setImageBitmap(bitmap); // 예시로 imageView에 이미지 설정
} catch (Exception e) {
e.printStackTrace();
runOnUiThread(() -> {
Toast.makeText(getApplicationContext(), "응답 처리 실패", Toast.LENGTH_SHORT).show();
새로 추가한 BitmapFactory.decodeStream()메서드는 주어진 입력 스트림에서 비트맵 이미지를 디코딩하여 생성하는 메서드이다. 이 메서드는 이미지 파일이나 네트워크에서 받은 이미지 데이터를 비트맵 객체로 변환할 때 사용된다.
final Bitmap bitmap = BitmapFactory.decodeStream(response.body().byteStream());