Synchronous(동기)와 Asynchronous(비동기)에 대해 들어보셨으리라 생각합니다. 원인은 이것 때문이고, 네트워크 라이브러리는 대부분 Async입니다. Volley의 경우는 Response.Listner의 콜백을 사용해서 결과를 받게 됩니다. Async이기 때문에 언제 결과가 올지는 알 수가 없습니다. 따라서 onCreate에서 Volley를 통해 요청을 보낸 다음, 바로 JsonData를 parsing해서 resultView에 텍스트를 추가하는 시점에 volley에서 응답이 아직 도착하지 않은 상태일 수 있습니다. 따라서 이 부부을 volley의 onResponse 메소드 안으로 옮기셔야 합니다.
public class WeatherExtraInfo {
private final double temp;
private final double feelsLike;
private final double speed;
// Constructor, getter 생략
}
public class MainActivity extends AppCompatActivity {
TextView resultView;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
StringRequest stringRequest = new StringRequest(Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
bindWeatherResponse(response); // <--- 응답을 받고나서 모든 처리.
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
resultView.setText("오류!");
}
});
requestQueue.add(stringRequest);
}
}
private void bindWeatherResponse(String response) {
StriingBuilder sb = new StringBuilder("Response:\n\n").append(response);
try. {
WeatherExtraInfo extraInfo = parseWeatherExtraInfo();
sb.append("\n\n\n온도:").append(extraInfo.getTemp())
.append("\n체감온도:").append(extraInfo.getFeelsLike())
.append("\n\n\n시속:").append(extraInfo.getSpeed());
resultView.setText(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private WeatherExtraInfo parseWeatherExtraInfo() {
String jsonData ="{\"main\":{\"temp\":278.08,\"feels_like\":276.63,\"temp_min\":278.08},"
+"\"wind\":{\"speed\":1.82, \"deg\":31}}";
JSONObject jsonObject = new JSONObject(jsonData);
JSONObject mainObject = jsonObject.getJSONObject("main");
double temp = mainObject.getDouble("temp");
double feelsLike = mainObject.getDouble("feels_like");
JSONObject windObject = jsonObject.getJSONObject("wind");
double speed = windObject.getDouble("speed");
return new WeatherExtraInfo(temp, feelsLike, speed);
}