본문 바로가기
Android

fragment에서 activity 로 이동할때 LifeCycle을 Log로 확인

by leopard4 2023. 3. 21.

Log.D는 플래그먼트의 라이프사이클

Log.I는 액티비티의 라이프사이클

탭바의 화면은 플래그먼트로 구성된것이고 

리사이클러뷰의 아이템 한개를 클릭하면 뜨는것은 액티비티이다.

 

 

 

아래코드는 진행중인 프로젝트에서 테스트한것이므로 코드가 지저분하니 안보는걸 추천

 

FirstFragment 코드

package com.leopard4.alcoholrecipe;


import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.leopard4.alcoholrecipe.adapter.RecipeHonorAdapter;
import com.leopard4.alcoholrecipe.adapter.RecipeMasterAdapter;
import com.leopard4.alcoholrecipe.api.GameApi;
import com.leopard4.alcoholrecipe.api.NetworkClient;
import com.leopard4.alcoholrecipe.api.RecipeApi;
import com.leopard4.alcoholrecipe.config.Config;
import com.leopard4.alcoholrecipe.model.cheers.CheersMent;
import com.leopard4.alcoholrecipe.model.cheers.CheersMentRes;
import com.leopard4.alcoholrecipe.model.cheers.Ment;
import com.leopard4.alcoholrecipe.model.recipe.RecipeHonor;
import com.leopard4.alcoholrecipe.model.recipe.RecipeHonorList;
import com.leopard4.alcoholrecipe.model.recipe.RecipeMaster;
import com.leopard4.alcoholrecipe.model.recipe.RecipeMasterList;

import java.util.ArrayList;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

/**
 * A simple {@link Fragment} subclass.
 * Use the {@link FirstFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class FirstFragment extends Fragment {

    // TODO: 매개변수 인수 이름 바꾸기, 프래그먼트 초기화 매개변수와 일치하는 이름 선택, 예: ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: 매개변수 이름 바꾸기 및 유형 변경
    private String mParam1;
    private String mParam2;
    // 멘트를 불러오기위한 단어를 저장하기 위한변수
    Button btnMyRecipe, btnGame, btnDogam, btnToast;
    TextView txtFirst, txtLast;
    int count1 = 0;
    int offset1 = 0;
    int limit1 = 5;

    int count2 = 0;
    int offset2 = 0;
    int limit2 = 5;
    String accessToken;
    ProgressBar progressBar3;

    RecyclerView recyclerView1, recyclerView2;
    RecipeMasterAdapter adapter1;
    RecipeHonorAdapter adapter2;
    ArrayList<RecipeMaster> recipeMasterList = new ArrayList<>();
    ArrayList<RecipeHonor> recipeHonorList = new ArrayList<>();
    ArrayList<CheersMent> cheersMentList = new ArrayList<>();

    private boolean isLoading1 = false;
    private boolean isLoading2 = false;

    public FirstFragment() {
        // Required empty public constructor
        Log.d("프래그먼트1", "플래그먼트생성자: ");
    }

    /**
     * 이 팩터리 메서드를 사용하여 제공된 매개 변수를 사용하여 이 조각의 새 인스턴스를 만듭니다.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return 프래그먼트 FirstFragment의 새 인스턴스입니다.
     */
    // TODO: 이름 변경 및 유형 및 매개변수 수 변경
    public static FirstFragment newInstance(String param1, String param2) {
        Log.d("프래그먼트2", "newInstance: ");
        FirstFragment fragment = new FirstFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("프래그먼트3", "onCreate: ");
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        Log.d("프래그먼트4", "onCreateView: ");
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_first, container, false);

        progressBar3 = rootView.findViewById(R.id.progressBar3);
        btnMyRecipe = rootView.findViewById(R.id.btnMyRecipe);
        btnGame = rootView.findViewById(R.id.btnGame);
        btnDogam = rootView.findViewById(R.id.btnDogam);
        btnToast = rootView.findViewById(R.id.btnToast);
        txtFirst = rootView.findViewById(R.id.txtFirst);
        txtLast = rootView.findViewById(R.id.txtLast);

        recyclerView1 = rootView.findViewById(R.id.recyclerView1);
        recyclerView1.setHasFixedSize(true);
        recyclerView1.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));

        recyclerView2 = rootView.findViewById(R.id.recyclerView2);
        recyclerView2.setHasFixedSize(true);
        recyclerView2.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));

        getNetworkData1();
        getNetworkData2();
        getCheersMentResNetworkData();

        recyclerView1.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView1, int newState) { // 스크롤이 멈추면
                super.onScrollStateChanged(recyclerView1, newState);
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView1, int dx, int dy) { // 스크롤이 되면
                super.onScrolled(recyclerView1, dx, dy);

                int lastPosition1 = ((LinearLayoutManager)recyclerView1.getLayoutManager()).findLastCompletelyVisibleItemPosition(); // 마지막으로 보여지는 아이템의 위치
                int totalCount1 = recyclerView1.getAdapter().getItemCount(); // 아이템의 총 개수
                if(lastPosition1+1 == totalCount1 && !isLoading1){ // 마지막 아이템이 보여지고 && 데이터를 불러오고 있지 않다면

                    // 네트워크 통해서 데이터를 더 불러온다.
                    if(count1 == limit1 ){
                        // 데이터를 불러오고 있다.
                        isLoading1 = true;
                        addNetworkData1();

                    }

                }

            }
        });

        recyclerView2.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView2, int newState) { // 스크롤이 멈추면
                super.onScrollStateChanged(recyclerView2, newState);
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView2, int dx, int dy) { // 스크롤이 되면
                super.onScrolled(recyclerView2, dx, dy);

                int lastPosition2 = ((LinearLayoutManager)recyclerView2.getLayoutManager()).findLastCompletelyVisibleItemPosition(); // 마지막으로 보여지는 아이템의 위치
                int totalCount2 = recyclerView2.getAdapter().getItemCount(); // 아이템의 총 개수
                if(lastPosition2+1 == totalCount2 && !isLoading2){ // 마지막 아이템이 보여지고 && 데이터를 불러오고 있지 않다면

                    // 네트워크 통해서 데이터를 더 불러온다.
                    if(count2 == limit2 ){
                        // 데이터를 불러오고 있다.
                        isLoading2 = true;
                        addNetworkData2();

                    }

                }

            }
        });


        btnMyRecipe.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), RecipeActivity.class);
                startActivity(intent);
            }
        });
        btnGame.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), GameActivity.class);
                startActivity(intent);
            }
        });
        btnDogam.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), DogamActivity.class);
                startActivity(intent);
            }
        });
        // 건배사공장으로 이동
        btnToast.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getActivity(), GameToastActivity.class);
                startActivity(intent);
            }
        });


        return rootView;
    }
    private void addNetworkData1(){
        progressBar3.setVisibility(View.VISIBLE);

        Retrofit retrofit = NetworkClient.getRetrofitClient(getActivity());
        RecipeApi api = retrofit.create(RecipeApi.class);

        Call<RecipeMasterList> call = api.getRecipeMaster(accessToken,offset1,limit1);
        call.enqueue(new Callback<RecipeMasterList>() {

            @Override
            public void onResponse(Call<RecipeMasterList> call, Response<RecipeMasterList> response) {
                progressBar3.setVisibility(View.GONE);

                if(response.isSuccessful()){
                    count1 = response.body().getCount();
                    recipeMasterList.addAll(response.body().getItems());

                    offset1 = offset1+count1;

                    adapter1.setOnItemClickListener(new RecipeMasterAdapter.onItemClickListener() {
                        @Override
                        public void onItemClick(int index) {
                            Intent intent = new Intent(getActivity(), RecipeInfoActivity.class);
                            intent.putExtra("recipeId", recipeMasterList.get(index).getId());
                            startActivity(intent);
                        }
                    });

                    adapter1.notifyDataSetChanged();

                    isLoading1 = false; // 데이터를 다불러왔다
                    // 데이터를 불러오는 동안에는 스크롤을 못하게 막는것이다.
                    // 자꾸 데이터를 두번씩 가져오므로...
                }
            }

            @Override
            public void onFailure(Call<RecipeMasterList> call, Throwable t) {
                progressBar3.setVisibility(View.GONE);
                Log.d("TAG", "onFailure: " + t.getMessage());
            }
        });
    }
    private void getNetworkData1(){
        progressBar3.setVisibility(View.VISIBLE);
        // 네트워크 통신을 위한 라이브러리인 Retrofit을 사용한다.
        // 1. 레트로핏 객체 생성
        Retrofit retrofit = NetworkClient.getRetrofitClient(getActivity());
        RecipeApi api = retrofit.create(RecipeApi.class);

        SharedPreferences sp = getActivity().getSharedPreferences(Config.PREFERENCE_NAME, getActivity().MODE_PRIVATE);
        accessToken = "Bearer "  + sp.getString(Config.ACCESS_TOKEN, "");// 액세스 토큰이 없으면 "" 리턴

        // 오프셋 초기화는, 함수 호출하기 전에!!
        offset1 = 0;
        count1 = 0;

        Call<RecipeMasterList> call = api.getRecipeMaster(accessToken, offset1,limit1);

        call.enqueue(new Callback<RecipeMasterList>() {
            @Override
            public void onResponse(Call<RecipeMasterList> call, Response<RecipeMasterList> response) {
                progressBar3.setVisibility(View.GONE);
                recipeMasterList.clear(); // 초기화

                if(response.isSuccessful()){
                    count1 = response.body().getCount();
                    recipeMasterList.addAll(response.body().getItems());

                    offset1 = offset1+count1;
                    adapter1 = new RecipeMasterAdapter(getActivity(),recipeMasterList);
                    adapter1.setOnItemClickListener(new RecipeMasterAdapter.onItemClickListener() {
                        @Override
                        public void onItemClick(int index) {
                            Intent intent = new Intent(getActivity(), RecipeInfoActivity.class);
                            intent.putExtra("recipeId", recipeMasterList.get(index).getId());
                            startActivity(intent);
                        }
                    });

                    recyclerView1.setAdapter(adapter1);
                }
            }

            @Override
            public void onFailure(Call<RecipeMasterList> call, Throwable t) {
                progressBar3.setVisibility(View.GONE);
                Log.d("TAG", "onFailure: " + t.getMessage());
            }
        });
    }

    private void addNetworkData2(){
        progressBar3.setVisibility(View.VISIBLE);

        Retrofit retrofit = NetworkClient.getRetrofitClient(getActivity());
        RecipeApi api = retrofit.create(RecipeApi.class);

        Call<RecipeHonorList> call = api.getRecipeHonor(accessToken,offset2,limit2);
        call.enqueue(new Callback<RecipeHonorList>() {

            @Override
            public void onResponse(Call<RecipeHonorList> call, Response<RecipeHonorList> response) {
                progressBar3.setVisibility(View.GONE);

                if(response.isSuccessful()){
                    count2 = response.body().getCount();
                    recipeHonorList.addAll(response.body().getItems());

                    offset2 = offset2+count2;

                    adapter2.setOnItemClickListener(new RecipeHonorAdapter.onItemClickListener() {
                        @Override
                        public void onItemClick(int index) {
                            Intent intent = new Intent(getActivity(), RecipeInfoActivity.class);
                            intent.putExtra("recipeId", recipeHonorList.get(index).getId());
                            startActivity(intent);
                        }
                    });

                    adapter2.notifyDataSetChanged();

                    isLoading2 = false; // 데이터를 다불러왔다
                    // 데이터를 불러오는 동안에는 스크롤을 못하게 막는것이다.
                    // 자꾸 데이터를 두번씩 가져오므로...
                }
            }

            @Override
            public void onFailure(Call<RecipeHonorList> call, Throwable t) {
                progressBar3.setVisibility(View.GONE);
                Log.d("TAG", "onFailure: " + t.getMessage());
            }
        });
    }
    private void getNetworkData2(){

        // 네트워크 통신을 위한 라이브러리인 Retrofit을 사용한다.
        // 1. 레트로핏 객체 생성
        Retrofit retrofit = NetworkClient.getRetrofitClient(getActivity());
        RecipeApi api = retrofit.create(RecipeApi.class);

        // 오프셋 초기화는, 함수 호출하기 전에!!
        offset2 = 0;
        count2 = 0;

        Call<RecipeHonorList> call = api.getRecipeHonor(accessToken,offset2,limit2);

        call.enqueue(new Callback<RecipeHonorList>() {
            @Override
            public void onResponse(Call<RecipeHonorList> call, Response<RecipeHonorList> response) {

                recipeHonorList.clear(); // 초기화

                if(response.isSuccessful()){
                    count2 = response.body().getCount();
                    recipeHonorList.addAll(response.body().getItems());

                    offset2 = offset2+count2;
                    adapter2 = new RecipeHonorAdapter(getActivity(),recipeHonorList );
                    adapter2.setOnItemClickListener(new RecipeHonorAdapter.onItemClickListener() {
                        @Override
                        public void onItemClick(int index) {
                            Intent intent = new Intent(getActivity(), RecipeInfoActivity.class);
                            intent.putExtra("recipeId", recipeHonorList.get(index).getId());
                            startActivity(intent);
                        }
                    });

                    recyclerView2.setAdapter(adapter2);
                }
            }

            @Override
            public void onFailure(Call<RecipeHonorList> call, Throwable t) {
                Log.d("TAG", "onFailure: " + t.getMessage());
            }
        });
    }

    private void getCheersMentResNetworkData(){

        Retrofit retrofit = NetworkClient.getRetrofitClient(getActivity());
        GameApi api = retrofit.create(GameApi.class);

        Ment ment = new Ment(); // 이 객체는 이 함수가 끝나면 사라진다.
        // 랜덤으로 창조말 가져오기
        ment.LandomMent();

        Call<CheersMentRes> call = api.getCheers(accessToken,2, ment ); // 2는 선창 후창임

        call.enqueue(new Callback<CheersMentRes>() {
            @Override
            public void onResponse(Call<CheersMentRes> call, Response<CheersMentRes> response) {

                if(response.isSuccessful()){
                    txtFirst.setText( response.body().getItem().getFirst() );
                    txtLast.setText( response.body().getItem().getLast() );


                }else{
                    // response가 에러를 가져왔다면 여기서 처리
                    txtFirst.setText("이미 집에 가기는");
                    txtLast.setText("너무 늦었어요");

                 }
            }

            @Override
            public void onFailure(Call<CheersMentRes> call, Throwable t) {
                Log.d("TAG", "onFailure: " + t.getMessage());

            }
        });
    }
    // 프래그먼트의 라이프 사이클을 확인
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("프래그먼트5", "onAttach: ");
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d("프래그먼트6", "onActivityCreated: ");
    }
    @Override
    public void onStart() {
        super.onStart();
        Log.d("프래그먼트7", "onStart: ");
    }
    @Override
    public void onResume() {
        super.onResume();
        Log.d("프래그먼트8", "onResume: ");
    }
    @Override
    public void onPause() {
        super.onPause();
        Log.d("프래그먼트9", "onPause: ");
    }
    @Override
    public void onStop() {
        super.onStop();
        Log.d("프래그먼트10", "onStop: ");
    }
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("프래그먼트11", "onDestroyView: ");
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("프래그먼트12", "onDestroy: ");
    }
    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("프래그먼트13", "onDetach: ");
    }
    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d("프래그먼트", "onSaveInstanceState: ");
    }
    @Override
    public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
        Log.d("프래그먼트14", "onViewStateRestored: ");
    }
    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d("프래그먼트15", "onConfigurationChanged: ");
    }
    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        Log.d("프래그먼트16", "onHiddenChanged: ");
    }
    @Override
    public void onLowMemory() {
        super.onLowMemory();
        Log.d("프래그먼트17", "onLowMemory: ");
    }


}

 

Recipe를 눌렀을때 나오는 레시피 상세페이지 액티비티코드

package com.leopard4.alcoholrecipe;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.bumptech.glide.Glide;
import com.leopard4.alcoholrecipe.api.LikeApi;
import com.leopard4.alcoholrecipe.api.NetworkClient;
import com.leopard4.alcoholrecipe.api.RecipeApi;
import com.leopard4.alcoholrecipe.config.Config;
import com.leopard4.alcoholrecipe.model.recipeOne.RecipeOne;
import com.leopard4.alcoholrecipe.model.recipeOne.RecipeOneResponse;

import java.util.ArrayList;

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public class RecipeInfoActivity extends AppCompatActivity {

    ImageView imgUrl,imgRecipeLike;
    TextView txtRecipeTitle, txtLikeCnt, txtPercent, txtAlcoholType, txtUserId, txtEngTitle, txtIntro, txtContent, txtIngredient;
    Button btnReturnRecipe;
    ImageView imgBack;
    private String accessToken;
    private int recipeId;
    private ArrayList<RecipeOne> recipeOneList = new ArrayList<>();
    // 상태가변화됨을 감지하는 변수
    boolean isChanged = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe_info);

        imgBack = findViewById(R.id.imgBack);
        btnReturnRecipe = findViewById(R.id.btnReturnRecipe);
        txtRecipeTitle = findViewById(R.id.txtRecipeTitle);
        imgUrl = findViewById(R.id.imgUrl);
        txtLikeCnt = findViewById(R.id.txtLikeCnt);
        txtPercent = findViewById(R.id.txtPercent);
        txtAlcoholType = findViewById(R.id.txtAlcoholType);
        txtUserId = findViewById(R.id.txtUserId);
        txtEngTitle = findViewById(R.id.txtEngTitle);
        txtIntro = findViewById(R.id.txtIntro);
        txtContent = findViewById(R.id.txtContent);
        txtIngredient = findViewById(R.id.txtIngredient);
        imgRecipeLike = findViewById(R.id.imgRecipeLike);




        recipeId = getIntent().getIntExtra("recipeId", 0);
        Log.i("레시피 아이디", Integer.toString(recipeId));

        getNetworkData();


        //  하트의 상태를 변화시킨다.
        imgRecipeLike.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (imgRecipeLike.isSelected()) { // 하트가 채워져 있다면
                    imgRecipeLike.setSelected(false); // 하트가 비워진다.

                    imgRecipeLike.setImageResource(R.drawable.baseline_favorite_border_24_gray);
                    // 비동기로 네트워크 실행
                    Retrofit retrofit = NetworkClient.getRetrofitClient(RecipeInfoActivity.this);
                    LikeApi api = retrofit.create(LikeApi.class);
                    Call<Void> call = api.deleteLike(accessToken, recipeId);
                    call.enqueue(new Callback<Void>() {
                        @Override
                        public void onResponse(Call<Void> call, Response<Void> response) {
                            if (response.isSuccessful()) {
                                // 상태가변화됨을 감지하는 변수
                                isChanged = true;
                                Log.i("하트", "하트가 눌렸습니다.");
                            }
                        }

                        @Override
                        public void onFailure(Call<Void> call, Throwable t) {
                            Log.i("하트", "하트가 눌리지 않았습니다.");
                        }
                    });


                } else { // 하트가 비워져 있다면
                    imgRecipeLike.setSelected(true); // 하트가 채워진다
                    imgRecipeLike.setImageResource(R.drawable.baseline_favorite_24);
                    // 비동기로 네트워크 실행
                    Retrofit retrofit = NetworkClient.getRetrofitClient(RecipeInfoActivity.this);
                    LikeApi api = retrofit.create(LikeApi.class);
                    Call<Void> call = api.postLike(accessToken, recipeId);
                    call.enqueue(new Callback<Void>() {
                        @Override
                        public void onResponse(Call<Void> call, Response<Void> response) {
                            if (response.isSuccessful()) {
                                isChanged = true;
                                Log.i("하트", "하트가 눌렸습니다.");
                            }
                        }

                        @Override
                        public void onFailure(Call<Void> call, Throwable t) {
                            Log.i("하트", "하트가 눌리지 않았습니다.");
                        }
                    });
                }
            }
        });

        // 뒤로가기 버튼
        imgBack.setOnClickListener(v -> {
            finish();
        });

        // 레시피 버튼을 눌렀을때 엑티비티 레시피로 이동~
        btnReturnRecipe.setOnClickListener(v -> {
            Intent intent = new Intent(RecipeInfoActivity.this, RecipeActivity.class);
            startActivity(intent);
        });
    }
    private void getNetworkData() {

        Retrofit retrofit = NetworkClient.getRetrofitClient(this);
        RecipeApi api = retrofit.create(RecipeApi.class);


        SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
        accessToken = "Bearer " + sp.getString(Config.ACCESS_TOKEN, "");// 액세스 토큰이 없으면 "" 리턴

        Call<RecipeOneResponse> call = api.getRecipeOne(accessToken, recipeId);

        call.enqueue(new Callback<RecipeOneResponse>() {

            @Override
            public void onResponse(Call<RecipeOneResponse> call, Response<RecipeOneResponse> response) {
                if (response.isSuccessful()) {

                    RecipeOne recipeOne = new RecipeOne();
//                    recipeOneList.addAll(response.body().getRecipeOne());

                    recipeOne = response.body().getRecipeOne();
                    // glide로 이미지 뿌려주기
                    Glide.with(RecipeInfoActivity.this)
                            .load(recipeOne.getImgUrl())
                            .into(imgUrl);
                    if (recipeOne.getIsLike() == 1) {
                        imgRecipeLike.setImageResource(R.drawable.baseline_favorite_24);
                    }

                    // recipeOnd에 값이 없는게 있을때 처리
                    if (recipeOne.getImgUrl() == null) {
                        recipeOne.setImgUrl("");
                    }
                    if (recipeOne.getAlcoholType() == null) {
                        recipeOne.setAlcoholType("");
                    }
                    if (recipeOne.getEngTitle() == null) {
                        recipeOne.setEngTitle("영어이름이 없어요");
                    }
                    if (recipeOne.getIntro() == null) {
                        recipeOne.setIntro("");
                    }
                    if (recipeOne.getContent() == null) {
                        recipeOne.setContent("");
                    }
                    if (recipeOne.getIngredient() == null) {
                        recipeOne.setIngredient("");
                    }
                    // 닉네임 뿌려주기
                    if (recipeOne.getUserId() == 1) {
                        txtUserId.setText("주인장의시크릿");
                    } else {
                        txtUserId.setText(recipeOne.getNickname());
                    }
                    // 도수 뿌려주기
                    if (recipeOne.getPercent() == 1) {
                        txtPercent.setText("약");
                    } else if (recipeOne.getPercent() == 2) {
                        txtPercent.setText("중");
                    } else if (recipeOne.getPercent() == 3) {
                        txtPercent.setText("강");
                    } else {
                        txtPercent.setText("알수없음");
                    }

                    // todo: 나중에 지워야댐 근데 레시피 db에는 주종이라는게 없는데 ??
                    Log.i("레시피 정보", response.body().toString());
                    Log.i("레시피 정보", recipeOne.toString()+"");
                    Log.i("레시피 정보", recipeOne.getImgUrl()+"");
                    Log.i("레시피 정보", recipeOne.getTitle()+"");
                    Log.i("레시피 정보", recipeOne.getLikeCnt()+"");
                    Log.i("레시피 정보", recipeOne.getPercent()+"");
                    Log.i("레시피 정보", recipeOne.getAlcoholType()+"");
                    Log.i("레시피 정보", recipeOne.getUserId()+"");
                    Log.i("레시피 정보", recipeOne.getEngTitle()+"");
                    Log.i("레시피 정보", recipeOne.getIntro()+"");
                    Log.i("레시피 정보", recipeOne.getContent()+"");
                    Log.i("레시피 정보", recipeOne.getIngredient()+ "");
                    Log.i("레시피 정보", recipeOne.getNickname()+ "");
                    Log.i("레시피 정보", recipeOne.getIsLike()+ "");

//                    imgUrl.setImageResource(Integer.parseInt(recipeOne.getImgUrl()));
                    txtRecipeTitle.setText(recipeOne.getTitle()+"");
                    txtLikeCnt.setText(recipeOne.getLikeCnt()+"");
                    txtAlcoholType.setText(recipeOne.getAlcoholType()+"");
                    txtEngTitle.setText(recipeOne.getEngTitle()+"");
                    txtIntro.setText(recipeOne.getIntro()+"");
                    txtContent.setText(recipeOne.getContent()+"");
                    txtIngredient.setText(recipeOne.getIngredient()+ "");

                }
            }


            @Override
            public void onFailure(Call<RecipeOneResponse> call, Throwable t) {
                Log.i("레시피 정보", t.getMessage());
            }
        });

    }

    // 액티비티의 lifeCycle을 관리하는 메소드
    @Override
    protected void onStart() {
        super.onStart();
        Log.i("온스타트", "onStart");
    }
    @Override
    protected void onResume() {
        super.onResume();
        Log.i("온리쥼", "onResume");
    }
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("온퍼즈", "onPause");
    }
    @Override
    protected void onStop() {
        super.onStop();
        Log.i("온스탑", "onStop");
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("온디스트로이", "onDestroy");
    }
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("온리스타트", "onRestart");
    }
    @Override
    protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i("온리스토어", "onRestoreInstanceState");
    }
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i("온세이브", "onSaveInstanceState");
    }
    // 백버튼을 눌렀는지
    @Override
    public void onBackPressed() {
        super.onBackPressed();
        Log.i("온백버튼", "onBackPressed");
    }




}