포스트맨에서 api 요청 시 필요한 것들을 확인한다. (httpmethod, url, 토큰 유무, 데이터 유무, 쿼리스트링 유무 등등)
public interface MemoApi {
// 메모 생성 API
@POST("/memo")
Call<Res> addMemo(@Header("Authorization") String token, @Body Memo memo);
// 내 메모리스트 가져오는 API
@GET("/memo")
Call<MemoList> getMemoList(@Header("Authorization") String token, @Query("offset") int offset, @Query("limit") int limit);
}
확인 후, api를 호출하기 위해 api 패키지 - MemoApi 인터페이스에서 함수를 만들어준다.
토큰(key와 value 형식)은 @Header에 작성
쿼리스트링 부분엔 두 변수가 있기 때문에 @Query(변수명)을 두번 작성한다.
model 패키지에 반환타입인 MemoList 클래스를 만들어 줘야 한다.
-> 응답 데이터를 받아와야 하기 때문
MemoList 클래스의 변수를 어떻게 처리할 지 포스트맨 응답결과를 참고 해서 작성한다.
// MemoList 클래스 부분
public class MemoList {
public String result;
public ArrayList<Memo> items;
public int count;
public MemoList(){
}
public MemoList(String result, ArrayList<Memo> items, int count) {
this.result = result;
this.items = items;
this.count = count;
}
}
앞서 만든 Memo 클래스와 유사하기 때문에, 새로운 클래스를 만들지 말고
public class Memo {
// 이전 Memo 변수
public String title;
public String date;
public String content;
// 바뀐 Memo 변수
// ArrayList<Memo>를 이용하기 위해 응답 데이터중 필요한 변수 id를 추가한 상태
public int id;
public String title;
public String date;
public String content;
// 아래는 생략
Memo 클래스를 위와 같이 수정한다.
그 후에는 그동안 했던 거와 같이,
어뎁터를 만들고 메인액티비티의 create()가 실행될 때 retrofit2 통신 후 어뎁터에 적용하면 된다.
MemoAdapter 코드
public class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.ViewHolder>{
Context context;
ArrayList<Memo> memoArrayList;
public MemoAdapter(Context context, ArrayList<Memo> memoArrayList) {
this.context = context;
this.memoArrayList = memoArrayList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.memo_row, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Memo memo = memoArrayList.get(position);
holder.txtTitle.setText(memo.title);
// todo : 날짜는 ISO 포맷으로 오기 때문에 가공해서 화면에 표시할 것이다.
holder.txtDate.setText(memo.date);
holder.txtContent.setText(memo.content);
}
@Override
public int getItemCount() {
return memoArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView txtTitle;
TextView txtDate;
TextView txtContent;
ImageView imgDelete;
CardView cardView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
txtTitle = itemView.findViewById(R.id.txtTitle);
txtDate = itemView.findViewById(R.id.txtDate);
txtContent = itemView.findViewById(R.id.txtContent);
imgDelete = itemView.findViewById(R.id.imgDelete);
cardView = itemView.findViewById(R.id.cardView);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
}
메인액티비티 코드
getNetworkData();
adapter = new MemoAdapter(MainActivity.this, memoArrayList);
recyclerView.setAdapter(adapter);
private void getNetworkData() {
Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
MemoApi api = retrofit.create(MemoApi.class);
SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
String token = sp.getString("token", "");
token = "Bearer " + token;
Call<MemoList> call = api.getMemoList(token, offset, limit);
call.enqueue(new Callback<MemoList>() {
@Override
public void onResponse(Call<MemoList> call, Response<MemoList> response) {
progressBar.setVisibility(View.GONE);
if (response.isSuccessful()){
MemoList memoList = response.body();
memoArrayList.addAll(memoList.items);
return;
} else if (response.code() == 500) {
Snackbar.make(btnAdd, "DB 오류", Snackbar.LENGTH_SHORT).show();
return;
} else if (response.code() == 400) {
Snackbar.make(btnAdd, "메모가 존재하지 않습니다.", Snackbar.LENGTH_SHORT).show();
return;
} else {
Snackbar.make(btnAdd, "잠시 후 이용하세요.", Snackbar.LENGTH_SHORT).show();
return;
}
}
@Override
public void onFailure(Call<MemoList> call, Throwable t) {
progressBar.setVisibility(View.GONE);
return;
}
});
}
'Android Studio' 카테고리의 다른 글
[Android Studio] Retrofit2 라이브러리를 이용할 CRUD 기능 처리 API 인터페이스 예시 (0) | 2024.01.05 |
---|---|
[Android Studio] Retrofit2 이용할 때 페이징 처리 하는 방법 (0) | 2024.01.05 |
[Android Studio] 유저에게 날짜 / 시간 정보 입력받기 DatePickerDialog(), TimePickerDialog() + 받아올 때 문자열 가공 (1) | 2024.01.04 |
[Android Studio] Retrofit2 통신 시 상태 코드에 따른 코드 작성법 (1) | 2024.01.04 |
[Android Studio] 네트워크로 데이터 처리할 때 사용하는 프로그레스 다이얼로그 만들기 (1) | 2024.01.04 |