로컬 캐시를 사용하는 방법이 궁금하신거 같네요.
먼저 아래처럼 급식정보를 가져오는 클래스를 하나 분리하세요. 코드 관리에 훨씬 좋습니다.
public class SchooldFoodRepository {
// 데이터 처리가 끝날 때 사용할 콜백 리스너
public interace Listener {
void onFoodInfoFectched();
void onFoodInfoFetchError(Exception e);
}
private Listener listenr;
public setListener(Listener listener) {
this.listener = listener;
}
// 쓰레드이므로 비동기로 동작하게 되므로 데이터 처리가 끝나면 콜백을 통해 알림을 받도록 한다.
public void fetchSchoolFoodInfo() {
Thread thread = new Thread(() -> {
try {
...
List<SingerItem> result = new ArrayList<>();
JSONObject jsonObject = ...
...
for (int i = 1; i < menut2.length(); i++) {
...
result.add(new SingerItem(gdt));
}
if (listener != null) listener.onFoodInfoFectched(result); //<---- 데이터 처리 성공시
} catch (Exception e) {
if (listener != null) listener.onFoodInfoFetchError(e); //<---- 에러발생시
}
});
thread.start();
}
}
이제 뷰쪽에서 위의 클래스를 가져다 사용하시면 됩니다.
private SchooldFoodRepository schooldFoodRepository;
// onCreate
schooldFoodRepository = new SchooldFoodRepository();
button2.setOnClickListener(v -> {
fetchSchoolFoodInfo();
});
private void fetchSchoolFoodInfo() {
schooldFoodRepository.fetchSchoolFoodInfo();
}
결과를 받기 위해서는 SchooldFoodRepository.setListener를 해주어야 하므로 Activity가 SchooldFoodRepository.Listener를 구현하도록 합니다.
public class MyActivity implemenst SchooldFoodRepository.Listener {
...
private SchooldFoodRepository schooldFoodRepository;
public void onCreate(...) {
super.onCreate(...);
...
schooldFoodRepository = new SchooldFoodRepository();
schooldFoodRepository.setListener(this);
button2.setOnClickListener(v -> {
fetchSchoolFoodInfo();
});
}
private void fetchSchoolFoodInfo() {
schooldFoodRepository.fetchSchoolFoodInfo();
}
@Override
public void onFoodInfoFectched(List<SingerItem> items) {
runOnUiThread { //UI를 업데이트 해야한다면 메인쓰레드에서 실행해야 함.
..
}
}
@Override
public void onFoodInfoFetchError(Exception e) {
// TODO : do something
}
}
학교급식정보를 한번만 가져온 후 재사용하려면 캐시를 사용하면 됩니다.
public class MyActivity implemenst SchooldFoodRepository.Listener {
...
private List<SingerItem> singerItems;
...
private void fetchSchoolFoodInfo() {
if (singerItems != null) {
// 화면 업데이트
return;
}
schooldFoodRepository.fetchSchoolFoodInfo();
}
@Override
public void onFoodInfoFectched(List<SingerItem> items) {
this.singerItems = items;
...
}
...
}
마지막으로 SchoolFoodRespository에 할당했던 Listener는 onStop에는 해제하고 onStart 에 할당해 주는게 쓸데없는 리소스를 낭비하지 않기 위해 필요합니다.
public void onCreate(...) {
super.onCreate(...);
...
// schooldFoodRepository.setListener(this); // --> 제거
...
}
@Override
public void onStart() {
super.onStart();
schooldFoodRepository.setListener(this);
}
@Override
public void onStop(...) {
super.onStop();
schooldFoodRepository.setListener(null);
}
도움이 되시길.