마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

thread 안에서 toast 띄우기

0 추천

안녕하세요. 지난번에도 한번 문의 드렸었는데 

도저히 답이 안나와서 다시한번 문의 드립니다.

 

모 게임 개발자센터에서  api키를 발급받아 json형식의 조회결과를 

data변수에 받은 후 

파싱하여 textview로 보여주는걸 구현하고자 합니다.

 

정보를 가져와서 textview에 보여주는건 완성하였지만, 검색결과가 없을시 아래처럼 toast 메시지를 띄워서 알려주려고 합니다.

 

구글링을 해보니 thread 에서 toast를 실행시키기 위해서는 runOnUiThread로 구현해야 한다고 하여

 

94행에 아래와 같이 코드를 작성하였는데..

검색은되지만 조회결과가 없을땐 여전히 토스트 메시지가 나타나지 않습니다..

runOnUiThread(new Runnable() {

public void run(){

  if (data == null){

Toast noCoach = Toast.makeText(MainActivity.this, "존재하지 않는 이름입니다", Toast.LENGTH_LONG);

noCoach.show();

}

}

}

 

고수님들의 많은 가르침 기다리겠습니다.

 

감사합니다.

 

 

 

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.net.Network;
import android.net.http.HttpResponseCache;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {
    TextView text1;
    EditText text2;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text1 = (TextView) findViewById(R.id.textView);
        text2 = (EditText) findViewById(R.id.editTextTextPersonName);
        button = (Button) findViewById(R.id.button);
    }
    public void btnMethod(View view) {
        NetworkThread thread = new NetworkThread();
        thread.start();
    }



    class NetworkThread extends Thread{
        String data;
        @Override
        public void run() {
            try{
                String coach = text2.getText().toString();
                String key = "API 키 값 입력";
                String site = "URL 입력"+coach;

                URL url = new URL(site);
                HttpURLConnection conn = (HttpURLConnection)url.openConnection();
                conn.addRequestProperty("Authorization", key);


                InputStream is = conn.getInputStream();
                InputStreamReader isr = new InputStreamReader(is,"UTF-8");
                BufferedReader br = new BufferedReader(isr);


                String str = null;
                StringBuffer buf = new StringBuffer();

                do{
                    str = br.readLine();
                    if(str != null){
                        buf.append(str);
                    }
                } while(str != null);

                data = buf.toString();

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        text1.setText("");
                    }
                });

                    JSONObject obj = new JSONObject(data);
                    String accessId = obj.getString("accessId");
                    String nickname = obj.getString("nickname");
                    int level = obj.getInt("level");

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            if (data == null){
                                Toast noCoach = Toast.makeText(MainActivity.this, "존재하지 않는 이름입니다", Toast.LENGTH_LONG);
                                noCoach.show();
                            }
                            text1.append("accessId : " + accessId + "\n");
                            text1.append("nickname : " + nickname + "\n");
                            text1.append("level : " + level + "\n\n");
                        }
                    });

            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

}
케이엠팍 (250 포인트) 님이 2021년 12월 6일 질문

1개의 답변

0 추천
 
채택된 답변

NetworkThread안에서  데이터를 읽어오는 부분을 다시 체크해 보셔야 할 것 같아요.

먼저, catch 블록 안에 에러가 발생할 가능성이 많아 보여요. 에러가 나는지 확인해 보세요.

특히, JSON을 파씽하는 부분은 의심스러워 보여요. data 가 null이거나 빈문자열일 가능성도 있어 보이구요.

만약에 data가 빈문자열이면 (if (data.isEmpty()))면 JSONObject을 생성할 때 에러가 날 것 같거든요. data가 잘못된 JSON 포맷이어도 에러가 날 거구요. 아래처럼 data가 널이거 빈문자열인지 체크해서, 그럴 경우는 Toast로 보여주는게 맞을 것 같습니다.

private void showEmptyDataMessage() {
   Toast.makeText(MainActivity.this, "존재하지 않는 이름입니다", Toast.LENGTH_LONG).show()
}

if (data == null || data.isEmpty()) {
    runOnUiThread(new Runnable() {
    @Override
    public void run() {
        showEmptyDataMessage();
    }
  });
  return;
}


JSONObject obj = new JSONObject(data);
String accessId = obj.getString("accessId");
String nickname = obj.getString("nickname");
int level = obj.getInt("level");

runOnUiThread(new Runnable() {
    @Override
    public void run() {
       text1.append("accessId : " + accessId + "\n");
        text1.append("nickname : " + nickname + "\n");
        text1.append("level : " + level + "\n\n");
    }
});

 

그리고 JSONObject를 사용할 때는 get* 메소드 대신에

String accessId = obj.getString("accessId");
String nickname = obj.getString("nickname");
int level = obj.getInt("level");

opt*메소드를 사용하는 것이 Exception을 던지지 않기 때문에 안전합니다.

String accessId = obj.optString("accessId", "");
String nickname = obj.optString("nickname", "");
int level = obj.optInt("level", 0);

 

브레이크 포인트를 설정하셔서 천천히 디버깅을 해보세요.

 

추가로 쓰레드를 심도있게 공부할 목적이 아니시면 Retrofit같은 표준에 가까운 라이브러리를 쓰는 것이 좋습니다.

spark (227,470 포인트) 님이 2021년 12월 6일 답변
spark님이 2021년 12월 6일 수정
...