public class DataFetcher {
Context context;
ArrayList<Memo> memoArrayList;
MemoAdapter adapter;
public DataFetcher(Context context, ArrayList<Memo> memoArrayList, MemoAdapter adapter) {
this.context = context;
this.memoArrayList = memoArrayList;
this.adapter = adapter;
}
public void fetchData(){
NetworkClient.getRetrofitClient(context);
MemoApi api = retrofit.create(MemoApi.class);
Call<MemoResponse> call = api.getMemoList();
call.enqueue(new Callback<MemoResponse>() {
@Override
public void onResponse(Call<MemoResponse> call, Response<MemoResponse> response) {
//200 ok
if(response.isSuccessful()){
MemoResponse memoResponse=response.body();
memoArrayList.addAll(memoResponse.data);
adapter.notifyDataSetChanged();
}else {
//fail
Log.e("DataFetcher", "Failed with code: " + response.code());
Toast.makeText(context,"데이터를 가져오는데 실패했습니다.",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<MemoResponse> call, Throwable throwable) {
Log.e("NetworkError", "API 호출 실패", throwable);
Toast.makeText(context, "네트워크 요청에 실패했습니다.", Toast.LENGTH_SHORT).show();
}
});
}
}
DataFetcher 클래스는 API에서 데이터를 가져오는 역할을 합니다.
이 클래스는 Retrofit을 사용하여 네트워크에서 데이터를 비동기적으로 가져오고, 가져온 데이터를 RecyclerView에 표시할 수 있도록 합니다. 아래에서 이 클래스의 각 부분을 자세히 설명드리겠습니다.
Retrofit은 REST API와의 통신을 간단하게 만들어 주며, 서버와의 데이터 교환을 쉽게 할 수 있도록 도와줍니다.
1. 클래스 멤버 변수
Context context;
ArrayList<Memo> memoArrayList;
MemoAdapter adapter;
- context: Context 객체는 앱의 환경 정보를 포함하며, Toast 메시지를 표시하거나, 네트워크 요청에 필요한 설정 등을 위해 사용됩니다.
- memoArrayList: Memo 객체들을 담는 리스트로, 네트워크에서 가져온 메모 데이터를 RecyclerView에서 표시하기 위해 사용됩니다.
- adapter: MemoAdapter 객체는 RecyclerView에 데이터를 표시하는 어댑터입니다. 이 어댑터는 memoArrayList 데이터를 화면에 바인딩합니다.
2. 생성자
public DataFetcher(Context context, ArrayList<Memo> memoArrayList, MemoAdapter adapter) {
this.context = context;
this.memoArrayList = memoArrayList;
this.adapter = adapter;
}
- DataFetcher 클래스의 생성자는 context, memoArrayList, adapter를 파라미터로 받습니다. 이들은 각각:
- context: 네트워크 통신과 UI 업데이트에 사용될 컨텍스트.
- memoArrayList: 데이터를 담을 리스트.
- adapter: 데이터를 화면에 표시하는 MemoAdapter입니다.
3. fetchData() 메서드
public void fetchData() {
NetworkClient.getRetrofitClient(context);
MemoApi api = retrofit.create(MemoApi.class);
Call<MemoResponse> call = api.getMemoList();
call.enqueue(new Callback<MemoResponse>() {
@Override
public void onResponse(Call<MemoResponse> call, Response<MemoResponse> response) {
if(response.isSuccessful()){
MemoResponse memoResponse = response.body();
memoArrayList.addAll(memoResponse.data);
adapter.notifyDataSetChanged();
} else {
Log.e("DataFetcher", "Failed with code: " + response.code());
Toast.makeText(context,"데이터를 가져오는데 실패했습니다.",Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<MemoResponse> call, Throwable throwable) {
Log.e("NetworkError", "API 호출 실패", throwable);
Toast.makeText(context, "네트워크 요청에 실패했습니다.", Toast.LENGTH_SHORT).show();
}
});
}
이 메서드의 역할:
fetchData() 메서드는 API에서 데이터를 가져오고, 그 데이터를 memoArrayList에 추가한 뒤, RecyclerView의 어댑터에 이를 반영하여 UI를 갱신합니다.
Retrofit 클라이언트 초기화:
NetworkClient.getRetrofitClient(context);
NetworkClient.getRetrofitClient(context)를 호출하여 Retrofit 객체를 가져옵니다.
NetworkClient는 Retrofit을 초기화하고 네트워크 요청을 처리하는 클라이언트 객체를 반환합니다.
API 호출 준비:
MemoApi api = retrofit.create(MemoApi.class);
Call<MemoResponse> call = api.getMemoList();
- retrofit.create(MemoApi.class)를 호출하여 MemoApi 인터페이스에서 정의한 API 요청 메서드를 사용합니다.
- call.enqueue(new Callback<MemoResponse>() {...})를 사용하여 비동기 방식으로 API 요청을 큐에 넣고, 결과를 비동기적으로 처리합니다.
응답 처리 (onResponse):
if (response.isSuccessful()) {
MemoResponse memoResponse = response.body();
memoArrayList.addAll(memoResponse.data);
adapter.notifyDataSetChanged();
} else {
Log.e("DataFetcher", "Failed with code: " + response.code());
Toast.makeText(context,"데이터를 가져오는데 실패했습니다.",Toast.LENGTH_SHORT).show();
}
- response.isSuccessful()가 true이면 응답이 성공적이었다는 의미입니다. 이때 response.body()를 통해 API 응답 본문을 가져오고, 그 데이터(memoResponse.data)를 memoArrayList에 추가합니다.
- adapter.notifyDataSetChanged()를 호출하여 RecyclerView의 데이터를 새로 고침합니다. 이렇게 하면 UI에서 데이터가 변경된 것을 반영하게 됩니다.
- 응답이 실패했을 경우에는 에러 로그와 Toast 메시지를 통해 오류를 알립니다.
네트워크 실패 처리 (onFailure):
Log.e("NetworkError", "API 호출 실패", throwable);
Toast.makeText(context, "네트워크 요청에 실패했습니다.", Toast.LENGTH_SHORT).show();
- 네트워크 요청이 실패했을 경우, onFailure() 메서드가 호출됩니다. 이 메서드에서는 예외 정보를 로그로 출력하고, Toast 메시지를 통해 사용자에게 네트워크 오류를 알립니다.
결론:
DataFetcher 클래스는 API 호출을 통해 메모 데이터를 가져와 이를 memoArrayList에 추가하고, RecyclerView의 어댑터를 갱신하여 UI에 데이터를 표시하는 역할을 합니다.
- 네트워크 요청이 성공하면 데이터를 리스트에 추가하고, RecyclerView의 어댑터에 변경 사항을 반영합니다.
- 응답 실패나 네트워크 실패 시, Toast로 사용자에게 알리고 로그에 오류 정보를 기록합니다.