FATAL EXCEPTION: OkHttp Dispatcher

Nbee·2024년 3월 25일
0

Project1

목록 보기
4/5

문제상황

서버에서 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());

  • OkHttp의 응답 본문에서 비트맵 이미지를 디코딩하여 'bitmap'변수에 할당하여서 생성된 비트맵 객체는 이후에 UI 업데이트 작업에서 사용할 수 있게 되었다.

profile
공부 겸 기록

0개의 댓글