프래그먼트의 리사이클러뷰에 당일 급식을 표시하는 애플리케이션을 제작하려고 합니다. 일단 Json객체가 제대로 불러와지고 읽어지는 것까지는 확인했는데 그걸 리사이클러뷰에 담으려고 하니 NullPointerException이 발생합니다.
GalleryFragment.java
public class GalleryFragment extends Fragment {
long mNow;
Date mDate;
SimpleDateFormat mFormat = new SimpleDateFormat("yyyyMMdd");
String res = ".";
private GalleryViewModel galleryViewModel;
private FragmentGalleryBinding binding;
RecyclerView recyclerView;
MealAdapter adapter;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
galleryViewModel =
new ViewModelProvider(this).get(GalleryViewModel.class);
binding = FragmentGalleryBinding.inflate(inflater, container, false);
View root = binding.getRoot();
recyclerView = root.findViewById(R.id.recyclerView);
adapter = new MealAdapter();
recyclerView.setAdapter(adapter);
dayNow();
String urlForm = "https://open.neis.go.kr/hub/mealServiceDietInfo?ATPT_OFCDC_SC_CODE=___&SD_SCHUL_CODE=_______&Type=json&KEY=_";
final String urlStr = urlForm+"&MLSV_YMD="+dayNow();
new Thread (new Runnable() {
@Override
public void run() {
request(urlStr);
}
}).start();
//불필요한 부분 제거
res = res.replace("[{\"head\":[{\"list_total_count\":2},{\"RESULT\":{\"CODE\":\"INFO-000\",\"MESSAGE\":\"정상 처리되었습니다.\"}}]},", "");
res = res.replace("[{\"head\":[{\"list_total_count\":1},{\"RESULT\":{\"CODE\":\"INFO-000\",\"MESSAGE\":\"정상 처리되었습니다.\"}}]},","");
res = res.replace("}]}]}", "}]}}");
TextView textView = root.findViewById(R.id.textView);
return root;
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
public void request(String urlStr) {
StringBuilder output = new StringBuilder();
try {
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn != null) {
conn.setRequestProperty("https.protocols", "TLSv1.2");
conn.setConnectTimeout(10000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
int resCode = conn.getResponseCode();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while (true) {
line = reader.readLine();
if (line == null) {
break;
}
output.append(line + "\n");
}
reader.close();
conn.disconnect();
}
} catch (Exception ex) {
Log.i(TAG, "request: "+ex.toString());
}
res = output.toString();
processResponse(res);
}
public void processResponse(String res) {
Gson gson = new Gson();
MealList mealList = gson.fromJson(res, MealList.class);
for (int i = 0; i < mealList.mealServiceDietInfo.row.size(); i++) { //NullPointerException 발생 지점
Meal meal = mealList.mealServiceDietInfo.row.get(i);
adapter.additem(meal);
}
adapter.notifyDataSetChanged();
}
private String dayNow() { //당일 날짜
mNow = System.currentTimeMillis();
mDate = new Date(mNow);
return mFormat.format(mDate);
}
}
Meal.java
package org.techtown.geubsik;
public class Meal {
public String ATPT_OFCDC_SC_NM;
public String SCCUL_NM;
public String MMEAL_SC_NM;
public String MLSV_YMN;
public String DDISH_NM;
public String ORPLC_INFO;
public String CAL_INFO;
public String NTR_INFO;
}
MealList.java
package org.techtown.geubsik;
public class MealList {
public MealListResult mealServiceDietInfo;
}
MealListResult.Java
package org.techtown.geubsik;
import java.util.ArrayList;
public class MealListResult {
public ArrayList<Meal> row = new ArrayList<Meal>();
}
로그캣 메시지
2021-11-07 19:28:16.579 27757-27793/org.techtown.geubsik E/AndroidRuntime: FATAL EXCEPTION: Thread-2
Process: org.techtown.geubsik, PID: 27757
java.lang.NullPointerException: Attempt to read from field 'java.util.ArrayList org.techtown.geubsik.MealListResult.row' on a null object reference
at org.techtown.geubsik.ui.gallery.GalleryFragment.processResponse(GalleryFragment.java:169)
at org.techtown.geubsik.ui.gallery.GalleryFragment.request(GalleryFragment.java:158)
at org.techtown.geubsik.ui.gallery.GalleryFragment$1.run(GalleryFragment.java:95)
at java.lang.Thread.run(Thread.java:761)