PHP에 JSON을 데이터를 읽어와 파싱하여 날씨와 관련된 앱을 개발하려고 합니다.
처음 개발을 할때 API 27 OREO 에서 개발을 하였는데
OREO에서는 HttpUrlConnection으로 읽어와 파싱하는데 문제가 없었는데
현재 핸드폰(S10 5G)또는 API 29 Q 또는 API 28 PIE 에서 HttpUrlConnection이 호출되면
connec() 구문에서 계속 예외가 처리됩니다.
버전이 달라진 후 로드자체가 안되어 혹시 28이상에 인터넷 연결관련 설정할 것이 더있는지
아니면 다른 문제점 지적 또는 알려주시면 감사하겠습니다...ㅠㅠ
HttpUrlConnection은 Fragment 에서 AsyncTask Background로 구동하였습니다.
코드와 에러도 첨부하겠습니다
아래는 에러문 입니다.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.a414lab.testnavigation, PID: 14995
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:121)
at org.json.JSONTokener.nextValue(JSONTokener.java:98)
at org.json.JSONObject.<init>(JSONObject.java:164)
at org.json.JSONObject.<init>(JSONObject.java:181)
at com.example.a414lab.testnavigation.HomeFragment.showIndoorResult(HomeFragment.java:202)
at com.example.a414lab.testnavigation.HomeFragment.access$500(HomeFragment.java:33)
at com.example.a414lab.testnavigation.HomeFragment$GetData2.onPostExecute(HomeFragment.java:367)
at com.example.a414lab.testnavigation.HomeFragment$GetData2.onPostExecute(HomeFragment.java:348)
at android.os.AsyncTask.finish(AsyncTask.java:755)
at android.os.AsyncTask.access$900(AsyncTask.java:192)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:772)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
private class GetData extends AsyncTask<String, Void, String> {
ProgressDialog progressDialog;
String errorString = null;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(getActivity(),
"데이터 로딩중입니다", null, true, true);
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressDialog.dismiss();
Log.d(TAG, "response - " + result);
mJsonString = result;
showOutdoorResult();
}
@Override
protected String doInBackground(String... params) {
String serverURL = params[0];
String postParameters = params[1];
try {
URL url = new URL(serverURL);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setReadTimeout(5000);
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoInput(true);
//↓↓↓↓↓↓↓↓↓ API 28 이상, S10 5G 에서 실행시
httpURLConnection.connect();
//↑↑↑↑↑↑↑↑↑ 이부분에서 에러가 발생합니다
//API 27 OREO 에서는 이상없이 구동이 되었습니다.
OutputStream outputStream = httpURLConnection.getOutputStream();
outputStream.write(postParameters.getBytes("UTF-8"));
outputStream.flush();
outputStream.close();
int responseStatusCode = httpURLConnection.getResponseCode();
Log.d(TAG, "response code - " + responseStatusCode);
InputStream inputStream;
if(responseStatusCode == HttpURLConnection.HTTP_OK) {
inputStream = httpURLConnection.getInputStream();
}
else{
inputStream = httpURLConnection.getErrorStream();
}
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuilder sb = new StringBuilder();
String line;
while((line = bufferedReader.readLine()) != null){
sb.append(line);
}
bufferedReader.close();
return sb.toString().trim();
} catch (Exception e) {
Log.d(TAG, "GetData : Error ", e);
errorString = e.toString();
return null;
}
}
}