Home 8월 30일 Today I Learned
Post
Cancel

8월 30일 Today I Learned

오늘 한 일

  • A·아이 프로젝트를 진행하였다
  • 블로그 TIL을 작성하였다
  • 1일 1커밋을 하였다

느낀 점

그동안 A·아이 프로젝트에서 실종아동 API 데이터를 리사이클러뷰 어뎁터에 연결하기 위해 여러 방법을 썼는데 1. Fragment들에서 API 호출 2. API를 SpalshActvitiy에서 처음에 받고 intent로 MainActvitiy로 넘겨서 Framgnet에서 사용하는 방식 3. API 데이터를 Room에 저장해서 Fragment에서 사용할 때 불러오기 세 방식을 모두 시도해봤지만 뭔가 좋은 방법이 아닌 거 같아서 계속 방법을 찾다가 ViewModel과 LiveData를 사용하는 방법을 찾게 되었다 그래서 적용해보니 훨씬 좋은 방법에다가 신세계였다 다음부터 위와 같은 상황에서는 꼭 ViewModel과 LiveData를 써야겠다고 느꼈고 다음에도 개발할 때는 계속해서 방법을 찾아봐야겠다

배운 점

Android MainActivity에서 ViewModel과 LiveData를 사용하여 Fragment에 데이터를 전달

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class MainActivity : AppCompatActivity() {
    private lateinit var viewModel: YourViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProvider(this).get(YourViewModel::class.java)
        viewModel.loadApiData()

        val fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.fragment_container, YourFragment())
        fragmentTransaction.commit()
    }
}

class YourViewModel : ViewModel() {
    private val apiData: MutableLiveData<YourDataType> = MutableLiveData()

        fun loadApiData() {
        val retrofit = Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()

        val apiService = retrofit.create(ApiService::class.java)
        val call = apiService.getData()

        call.enqueue(object : Callback<YourDataType> {
            override fun onResponse(call: Call<YourDataType>, response: Response<YourDataType>) {
                if (response.isSuccessful) {
                    apiData.value = response.body()
                }
            }

            override fun onFailure(call: Call<YourDataType>, t: Throwable) {
                // Handle failure
            }
        })
    }
    fun getApiData(): LiveData<YourDataType> {
        return apiData
    }
}

class YourFragment : Fragment() {
    private lateinit var viewModel: YourViewModel

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel = ViewModelProvider(requireActivity()).get(YourViewModel::class.java)

        viewModel.getApiData().observe(viewLifecycleOwner, { apiData ->
            // LiveData 변경 시 호출되는 부분
            // apiData를 리사이클러뷰 어댑터에 전달하고 업데이트하는 로직을 구현
        })
    }
}

해당 코드를 이용하여 값들을 자신에 상황에 맞게 바꾸면 안드로이드에서 데이터를 API로부터 받아와 MainActivity에서 ViewModel과 LiveData를 사용하여 Fragment에 데이터를 전달할 수 있다

내일 계획

내일은 A·아이 프로젝트 진행해야겠다

This post is licensed under CC BY 4.0 by the author.

8월 29일 Today I Learned

8월 31일 Today I Learned