꾸준히 안타치기
서버통신 Retrofit2사용법 본문
반응형
https://medium.com/@prakash_pun/retrofit-a-simple-android-tutorial-48437e4e5a23
https://www.youtube.com/watch?v=p4sYbZsTMDo&list=PLT3-dzFEBix379Q2s31apenJtBPOFSVZZ&index=4
Rertofit이란?
- REST API 통신을 위해 구현된
- 동일 Squareup사의 OkHttp 라이브러리의 상위 구현체
: Retrofit은 OkHttp를 네트워크 계층으로 활용하고 그 위에 구축됨 - AsyncTask 없이 Background Thread 실행 -> Callback을 통해 Main Thread에서 UI 업데이트
Rertofit의 장점과 단점 / 사용하는 이유
- 빠른 성능
Okhttp는 AsyncTask를 사용 (AsyncTask의 3~10배의 성능차이가 난다고 함) - 간단한 구현 - 반복된 작업을 라이브러리 넘겨서 처리
HttpUrlConection의 Connection / Input&OutputStream / URL Encoding 생성 및 할당의 반복작업
OkHttp의 쿼리스트링, Request / Response 반복 설정 작업 - 가독성
Annotation(애노테이션) 사용으로 코드의 가독성이 뛰어남, 직관적인 설계가 가능 - 동기/비동기 쉬운 구현
동기 Synchronous - 동시에 일어난다는 의미로, 요청-응답이 하나의 트랜잭션(작업)에서 발생
요청 후 응답까지 대기한다는 의미
비동기 Asynchronous - 동시에 일어나지 않는다는 뜻으로, 요청-응답은 별개의 트랜잭션
요청 후 응답이 도착하면 Callback으로 받아서 처리
3가지 구성요소
- DTO (POJO) - 'Data Transfer Object', 'Plain Old Java Object' 형태의 모델(Model) / JSON 타입변환에 사용
- Interface - 사용할 HTTP CRUD동작(메소드) 들을 정의해놓은 인터페이스
* CRUD ( Create / Read / Update / Delete ) -> HTTP Method ( POST / GET / PUT / DELETE ) - Retrofit.Builder 클래스 - Interface를 사용할 인스턴스, baseUrl(URL) / Converter(변환기) 설정
레트로핏 사용법
Api클라이언트 작성
package com.example.myapplication.Recipe;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
private static final String BASE_URL="http://서버주소/";
private static Retrofit retrofit;
public static Retrofit getApiClient() {
if (retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
인터페이스 작성
package com.example.myapplication.Recipe;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;
public interface ApiInterface {
@FormUrlEncoded
@POST("save.php")
Call<Note> saveNote(
// 서버에서 받을것
@Field("title") String title,
@Field("note") String note,
@Field("color") String color
);
}
받아올 데이터 모델
package com.example.myapplication.Recipe;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;
public class Note {
@Expose
@SerializedName("userID") private int userID;
@Expose
@SerializedName("title") private String title;
@Expose
@SerializedName("note") private String note;
@Expose
@SerializedName("color") private String color;
@Expose
@SerializedName("date") private String date;
@Expose
@SerializedName("success") private Boolean success;
@Expose
@SerializedName("message") private String message;
public int getUserID() {
return userID;
}
public void setUserID(int userID) {
this.userID = userID;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
액티비티
package com.example.myapplication.Recipe;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.Toast;
import com.example.myapplication.R;
import org.jetbrains.annotations.NotNull;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class EditActivity extends AppCompatActivity {
EditText et_title, et_note;
ProgressDialog progressDialog;
ApiInterface apiInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit);
et_title = findViewById(R.id.title);
et_note = findViewById(R.id.note);
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("기다려");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_editer, menu);
return true;
}
@SuppressLint("NonConstantResourceId")
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.save:
String title = et_title.getText().toString().trim();
String note = et_note.getText().toString().trim();
String color = "2222";
if (title.isEmpty()) {
et_title.setError("제목을 작성하세요");
} else if (note.isEmpty()) {
et_note.setError("노트를 작성하세요.");
} else {
saveNote(title, note, color);
}
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void saveNote(final String title, final String note, final String color) {
progressDialog.show();
apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
Call<Note> call = apiInterface.saveNote(title, note, color);
call.enqueue(new Callback<Note>() {
@Override
public void onResponse(@NotNull Call<Note> call, @NotNull Response<Note> response) {
progressDialog.dismiss();
if (response.isSuccessful() && response.body() != null) {
Boolean success = response.body().getSuccess();
if (success) {
Toast.makeText(EditActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
finish(); // 메인액티비티로 돌아감
}
} else {
assert response.body() != null;
Toast.makeText(EditActivity.this, response.body().getMessage(), Toast.LENGTH_SHORT).show();
finish(); // 에러시 그대로있음
}
}
@Override
public void onFailure(@NonNull Call<Note> call, @NonNull Throwable t) {
progressDialog.dismiss();
Toast.makeText(EditActivity.this, t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
https://jaejong.tistory.com/33
http://devflow.github.io/retrofit-kr/
https://www.youtube.com/watch?v=Vh92eSAEu5c&t=1692s
https://dev-juyoung.github.io/2017/11/10/android-retrofit-basic/
레트로핏사용시 겪었던 오류
https://coding-food-court.tistory.com/177
반응형
'Android _ 서버연동_채팅 > Android - study' 카테고리의 다른 글
TCP/IP 채팅예제 / Android / 채팅방법 (0) | 2021.09.20 |
---|---|
레트로핏 사용법 (0) | 2021.08.30 |
체크박스 유지하기 (0) | 2021.08.26 |
Application class (0) | 2021.08.21 |
Volley (0) | 2021.08.08 |
Comments