Restful API(메모 API)를 만들고, MySQL과 연동하여 Postman으로 개발한 후, 진행하였다.
액티비티 세 개 만들기
환경변수 설정하기
Retrofit 라이브러리 설치하기
build.gradle.kts(:app)에서
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")
하고, Sync 눌러준다.
activity_login.xml 만들기
글자에 밑줄 생기게 하기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="30dp"
android:gravity="center"
android:text="로그인"
android:textSize="32sp" />
<EditText
android:id="@+id/editEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:ems="10"
android:hint="이메일 입력..."
android:inputType="textEmailAddress"
android:textSize="20sp" />
<EditText
android:id="@+id/editPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
android:ems="10"
android:hint="비밀번호 입력..."
android:inputType="textPassword"
android:textSize="20sp" />
<Button
android:id="@+id/btnLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:text="로그인"
android:textSize="20sp" />
<TextView
android:id="@+id/txtRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/txt_register"
android:textColor="#3F51B5"
android:textSize="20sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
LoginActivity.java
화면연결 자바코드 작성하기
package com.~.memo;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
public class LoginActivity extends AppCompatActivity {
EditText editEmail;
EditText editPassword;
TextView txtRegister;
Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
editEmail = findViewById(R.id.editEmail);
editPassword = findViewById(R.id.editPassword);
txtRegister = findViewById(R.id.txtRegister);
btnLogin = findViewById(R.id.btnLogin);
txtRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//회원가입 액티비티 실행
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
finish();
}
});
}
}
activity_Register.xml 만들기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="10dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="10dp"
android:layout_marginBottom="10dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="30dp"
android:gravity="center"
android:text="회원가입"
android:textSize="32sp" />
<EditText
android:id="@+id/editEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:ems="10"
android:hint="이메일 입력..."
android:inputType="textEmailAddress"
android:textSize="20sp" />
<EditText
android:id="@+id/editPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:ems="10"
android:hint="비밀번호 입력..."
android:inputType="textPassword"
android:textSize="20sp" />
<EditText
android:id="@+id/editNickname"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp"
android:ems="10"
android:hint="닉네임 입력..."
android:inputType="text"
android:textSize="20sp" />
<Button
android:id="@+id/btnRegister"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="30dp"
android:text="회원가입"
android:textSize="20sp" />
<TextView
android:id="@+id/txtLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/txt_login"
android:textColor="#3F51B5"
android:textSize="20sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
RegisterActivity.java
화면연결 자바코드 작성하기
package com.~.memo;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class RegisterActivity extends AppCompatActivity {
EditText editEmail;
EditText editPassword;
EditText editNickname;
Button btnRegister;
TextView txtLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
editEmail = findViewById(R.id.editEmail);
editPassword = findViewById(R.id.editPassword);
editNickname = findViewById(R.id.editNickname);
btnRegister = findViewById(R.id.btnRegister);
txtLogin = findViewById(R.id.txtLogin);
txtLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 로그인 액티비티 실행
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
}
}
api, config 만들기
NetworkClient.java
package com.~.memo.api;
import android.content.Context;
import com.~.memo.config.Config;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class NetworkClient {
public static Retrofit retrofit;
public static Retrofit getRetrofitClient(Context context){
if(retrofit == null){
// 통신 로그 확인할때 필요한 코드
HttpLoggingInterceptor loggingInterceptor =
new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// 네트워크 연결관련 코드
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.addInterceptor(loggingInterceptor)
.build();
// 네트워크로 데이터를 보내고 받는
// 레트로핏 라이브러리 관련 코드
retrofit = new Retrofit.Builder()
.baseUrl(Config.DOMAIN)
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
UserApi.java
package com.~.memo.api;
import com.~.memo.model.User;
import com.~.memo.model.UserRes;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;
public interface UserApi { //인터페이스로 바꿔준다.
// HTTP Method 써주고, 그 안에는 경로를 써준다.
// 함수의 리턴 데이터 타입은, Call 안에 응답으로 받을 클래스를 넣어준다.
// 함수명을 작성해주고, 보낼 데이터는 파라미터에 작성, 받을 데이터는 리턴에 작성.
// 회원가입 API
@POST("/dev/user/register")
Call<UserRes> register(@Body User user);
// 로그인 API
@POST("/dev/user/login")
Call<UserRes> login(@Body User user);
}
Config.java
package com.yujinoh.memo.config;
public class Config {
public static final String YOUTUBE_KEY = "자신의 key 입력";
public static final String DOMAIN = "자신의 아마존 api 주소 입력";
//public static final String DOMAIN = "https://vrskmc6b8c.execute-api.ap-northeast-2.amazonaws.com";
}
model 패키지 만들고, User 와 UserRes 클래스 만들기
User 클래스 만들기
package com.~.memo.model;
public class User {
public String email;
public String password;
public String nickname;
public User(){
}
public User(String email, String password){
this.email = email;
this.password = password;
}
public User(String email, String password, String nickname) {
this.email = email;
this.password = password;
this.nickname = nickname;
}
}
UserRes 클래스
package com.~.memo.model;
public class UserRes {
public String result;
public String accessToken;
}
RegisterActivity.java
회원가입 버튼 누르면, 회원가입 되도록 postman과 연결하기
package com.~.memo;
import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.material.snackbar.Snackbar;
import com.~.memo.api.NetworkClient;
import com.~.memo.api.UserApi;
import com.~.memo.config.Config;
import com.~.memo.model.User;
import com.~.memo.model.UserRes;
import java.util.regex.Pattern;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class RegisterActivity extends AppCompatActivity {
EditText editEmail;
EditText editPassword;
EditText editNickname;
Button btnRegister;
TextView txtLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
editEmail = findViewById(R.id.editEmail);
editPassword = findViewById(R.id.editPassword);
editNickname = findViewById(R.id.editNickname);
btnRegister = findViewById(R.id.btnRegister);
txtLogin = findViewById(R.id.txtLogin);
txtLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 로그인 액티비티 실행
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
}
});
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 1. 유저가 입력한 데이터들을 가져온다.
String email = editEmail.getText().toString().trim();
String password = editPassword.getText().toString().trim();
String nickname = editNickname.getText().toString().trim();
if(email.isEmpty() || password.isEmpty() || nickname.isEmpty()){
Snackbar.make(btnRegister, "필수항목입니다. 모두입력하세요.", Snackbar.LENGTH_SHORT).show();
return;
}
// 2. 이메일 형식이 올바른지 체크
// 자바의 이메일 형식 체크하는 라이브러리 Pattern
Pattern pattern = Patterns.EMAIL_ADDRESS;
if(pattern.matcher(email).matches() == false){
Snackbar.make(btnRegister,"이메일 형식을 바르게 작성하세요.",Snackbar.LENGTH_SHORT).show();
return;
}
// 회원가입 API를 호출한다.
// 0. 다이얼로그를 보여준다.
showProgress();
// 1. 레트로핏 변수 생성 : api 패키지에 NetworkClient.java 파일이 있어야 한다.
Retrofit retrofit = NetworkClient.getRetrofitClient(RegisterActivity.this);
// 2. api 패키지에 있는 인터페이스를 객체로 생성 : api 패키지에 인터페이스가 있어야 한다.
UserApi api = retrofit.create(UserApi.class);
// 3. 보낼 데이터를 만든다.
User user = new User(email, password, nickname);
// 4. api 함수를 만든다.
Call<UserRes> call = api.register(user);
// 5. api를 호출한다.
call.enqueue(new Callback<UserRes>() {
@Override
public void onResponse(Call<UserRes> call, Response<UserRes> response) {
Log.i("MEMO REGISTER", ""+response.code());
//다이얼로그를 먼저 없앤다.
dismissProgress();
// 200 OK 일때,
if(response.isSuccessful()){
UserRes userRes = response.body();
Log.i("MEMO REGISTER",userRes.accessToken);
// 서버로부터 받은 토큰을 저장해야 한다.
SharedPreferences sp = getSharedPreferences(Config.SP_NAME,MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("token", userRes.accessToken);
editor.commit(); //앱을 삭제하기 전까지는 영구저장해준다
// 회원가입 액티비티는 종료를 하고 메인액티비티띄운다.
Intent intent = new Intent(RegisterActivity.this, MainActivity.class);
startActivity(intent);
finish();
return;
}else if(response.code() == 500){
Snackbar.make(btnRegister, "이미 회원가입한 이메일입니다. 로그인하세요.",
Snackbar.LENGTH_SHORT).show();
return;
}else {
Snackbar.make(btnRegister, "서버에 문제가 있습니다. 잠시 후 다시 시도하세요.",
Snackbar.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<UserRes> call, Throwable throwable) {
//다이얼로그를 먼저 없앤다.
dismissProgress();
}
});
}
});
}
// *** 서버에 데이터를 저장하거나, 수정하거나, 삭제하는 경우에 사용한다!
Dialog dialog;
void showProgress(){
dialog = new Dialog(this);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setContentView(new ProgressBar(this));
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
void dismissProgress(){
dialog.dismiss();
}
}
LoginActivity.java
로그인 버튼 누르면, 로그인 되도록 postman과 연결하기
package com.yujinoh.memo;
import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.util.Log;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import com.google.android.material.snackbar.Snackbar;
import com.yujinoh.memo.api.NetworkClient;
import com.yujinoh.memo.api.UserApi;
import com.yujinoh.memo.config.Config;
import com.yujinoh.memo.model.User;
import com.yujinoh.memo.model.UserRes;
import java.util.regex.Pattern;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class LoginActivity extends AppCompatActivity {
EditText editEmail;
EditText editPassword;
TextView txtRegister;
Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
editEmail = findViewById(R.id.editEmail);
editPassword = findViewById(R.id.editPassword);
txtRegister = findViewById(R.id.txtRegister);
btnLogin = findViewById(R.id.btnLogin);
txtRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//회원가입 액티비티 실행
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
finish();
}
});
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = editEmail.getText().toString().trim();
String password = editPassword.getText().toString().trim();
if(email.isEmpty() || password.isEmpty()){
Snackbar.make(btnLogin, "필수항목입니다. 모두 입력하세요.",Snackbar.LENGTH_SHORT).show();
return;
}
// 이메일 형식 체크 (회원가입의 코드 C&P)
// 자바의 이메일 형식 체크하는 라이브러리 Pattern
Pattern pattern = Patterns.EMAIL_ADDRESS;
if(pattern.matcher(email).matches() == false){
Snackbar.make(btnLogin,"이메일 형식을 바르게 작성하세요.",Snackbar.LENGTH_SHORT).show();
return;
}
// 로그인 API 호출!
// 0. 다이얼로그 표시한다.
showProgress();
// 1. 레트로핏 변수 만든다.
Retrofit retrofit = NetworkClient.getRetrofitClient(LoginActivity.this);
// 2. API 객체 생성한다
UserApi api = retrofit.create(UserApi.class);
// 3. 보낼 데이터를 만든다.
User user = new User(email, password);
// 4. api 함수를 만든다.
Call<UserRes> call = api.login(user);
// 5. 네트워크로 호출한다
call.enqueue(new Callback<UserRes>() {
@Override
public void onResponse(Call<UserRes> call, Response<UserRes> response) {
dismissProgress();
if(response.isSuccessful()){
UserRes userRes = response.body();
// 서버로부터 받은 토큰을 저장해야 한다.
SharedPreferences sp = getSharedPreferences(Config.SP_NAME,MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("token", userRes.accessToken);
editor.commit(); //앱을 삭제하기 전까지는 영구저장해준다
// 회원가입 액티비티는 종료를 하고 메인액티비티띄운다.
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
return;
}else{
Snackbar.make(btnLogin, "서버에 문제가 있습니다. 잠시 후 다시 시도하세요.",
Snackbar.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<UserRes> call, Throwable throwable) {
dismissProgress();
// 유저에게 알리고 로그남기고 리턴
}
});
}
});
}
// *** 서버에 데이터를 저장하거나, 수정하거나, 삭제하는 경우에 사용한다!
Dialog dialog;
void showProgress(){
dialog = new Dialog(this);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
dialog.setContentView(new ProgressBar(this));
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
}
void dismissProgress(){
dialog.dismiss();
}
}
로그아웃 기능 만들기
menu 패키지를 만들어주고, xml 파일을 만들어서 액션바에 아이콘을 넣으려고 한다.
https://codebunny99.tistory.com/139
액션바 아이콘 추가를 참고한다.
UserApi 에 로그아웃 API를 입력해준다.
MainActivity에 작성해주기
package com.~.memo;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.~.memo.adapter.MemoAdapter;
import com.~.memo.api.MemoApi;
import com.~.memo.api.NetworkClient;
import com.~.memo.api.UserApi;
import com.~.memo.config.Config;
import com.~.memo.model.Memo;
import com.~.memo.model.MemoList;
import com.~.memo.model.UserRes;
import java.util.ArrayList;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
public class MainActivity extends AppCompatActivity {
ProgressBar progressBar;
Button btnAdd;
RecyclerView recyclerView;
ArrayList<Memo> memoArrayList = new ArrayList<>();
MemoAdapter adapter;
String token;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 로그인을 한 유저인지 아닌지를 체크한다.
// 로그인을 안했으면, 로그인 액티비티를 띄우고,
// 로그인을 했으면, 인증토큰을 가져온다.
SharedPreferences sp = getSharedPreferences(Config.SP_NAME, MODE_PRIVATE);
token = sp.getString("token", "");
if(token.isEmpty()){
// 로그인 액티비티를 띄운다.
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
finish();
return;
}
progressBar = findViewById(R.id.progressBar);
btnAdd = findViewById(R.id.btnAdd);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, AddActivity.class);
startActivity(intent);
}
});
// 내 메모 리스트를 가져온다.
getNetworkData();
}
private void getNetworkData() {
Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
MemoApi api = retrofit.create(MemoApi.class);
Call<MemoList> call = api.getMemoList("Bearer "+token);
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.getItems() );
// 데이터가 준비 완료 되었으니,
// 어뎁터 만들어서, 리사이클러뷰에 적용한다.
adapter = new MemoAdapter(MainActivity.this, memoArrayList);
recyclerView.setAdapter(adapter);
}else {
}
}
@Override
public void onFailure(Call<MemoList> call, Throwable throwable) {
progressBar.setVisibility(View.GONE);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if( item.getItemId() == R.id.menuLogout ){
showAlertDialog();
}
return super.onOptionsItemSelected(item);
}
void showAlertDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setCancelable(true);
builder.setTitle("로그아웃");
builder.setMessage("정말 로그아웃 하시겠습니까??");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 로그아웃 API 호출!
Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
UserApi api = retrofit.create(UserApi.class);
Call<UserRes> call = api.logout("Bearer " + token);
call.enqueue(new Callback<UserRes>() {
@Override
public void onResponse(Call<UserRes> call, Response<UserRes> response) {
if(response.isSuccessful()){
SharedPreferences sp = getSharedPreferences(Config.SP_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("token", "");
editor.commit();
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
startActivity(intent);
finish();
return;
}else{
}
}
@Override
public void onFailure(Call<UserRes> call, Throwable throwable) {
}
});
}
});
builder.setNegativeButton("No", null);
builder.show();
}
}
'Android' 카테고리의 다른 글
(안드로이드 스튜디오) 카메라 촬영 사진 업로드 권한 설정, 이미지 업로드하는 기능 만들기 (2) | 2024.06.14 |
---|---|
(android studio 안드로이드 스튜디오) AlertDialog 팝업창 쉽게 만드는 방법 (0) | 2024.06.14 |
서버에 데이터를 저장, 수정, 삭제하는 경우 사용하는 코드 (SharedPreferences에 저장하기) (2) | 2024.06.13 |
Volley 보다 쉽게 사용 가능한 Retrofit2 라이브러리로 유튜브 app 개발하기 (0) | 2024.06.13 |
어플 만들기 : 페이징(스크롤) 처리를 가능하게 하는 코드 작성하기 (0) | 2024.06.12 |