Thuta Learning
ရှာဖွေရန်
ProjectsMobile Developmentintermediate

Project — Weather App (Retrofit + Coroutines)

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Project — Weather App (Retrofit + Coroutines) ကို ကြောက်စရာမလိုအောင် နားလည်မယ်
  • ကိုယ်တိုင် Android Studio/Compose code ကို run ကြည့်တတ်မယ်
  • Real project ထဲမှာ ဒီ concept ကို ချက်ချင်း အသုံးချတတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

Network-based app တစ်ခုမှာ loading state (data fetch နေဆဲ), success state (data ရပြီး), error state (network fail) — state သုံးမျိုးကို UI မှာ handle လုပ်ပေးရပါတယ် — user ကို 'ဘာဖြစ်နေလဲ' အမြဲ သိစေရမှာပါ (blank screen တစ်ခုတည်း ချန်ထားလို့ မရပါ)။ `sealed class UiState { object Loading; data class Success(val data: WeatherResponse); data class Error(val message: String) }` ဆိုတဲ့ pattern ကို state management အတွက် သုံးလေ့ရှိပါတယ်.

လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်

City name TextField ထဲ ရိုက်ပြီး Search button ကို click ရင် — ViewModel က `uiState = UiState.Loading` လို့ ပြောင်းပြီး, `weatherApi.getWeather(city)` ကို coroutine ထဲ ခေါ်ပါတယ် — success ဖြစ်ရင် `UiState.Success(response)`, fail ဖြစ်ရင် (network down, city not found) `UiState.Error("...")` ဆိုပြီး state ပြောင်းပါတယ်, UI ကတော့ `when (uiState) { is Loading -> CircularProgressIndicator(); is Success -> WeatherCard(...); is Error -> ErrorMessage(...) }` ဆိုပြီး state အလိုက် ကွဲပြားစွာ render လုပ်ပါတယ်.

အတူတူ ကြည့်မယ်

kotlin
sealed class WeatherUiState {
    object Loading : WeatherUiState()
    data class Success(val data: WeatherResponse) : WeatherUiState()
    data class Error(val message: String) : WeatherUiState()
}

class WeatherViewModel @Inject constructor(
    private val api: WeatherApi
) : ViewModel() {
    var uiState by mutableStateOf<WeatherUiState>(WeatherUiState.Loading)
        private set

    fun search(city: String) {
        uiState = WeatherUiState.Loading
        viewModelScope.launch {
            uiState = try {
                WeatherUiState.Success(api.getWeather(city))
            } catch (e: Exception) {
                WeatherUiState.Error("Could not load weather for $city")
            }
        }
    }
}
You should see
City name ရိုက်ထည့်ပြီး search ရင် loading spinner → weather data (ဒါမှမဟုတ် error message) ကို screen ပေါ်မှာ တွေ့ရမည်။

၅ မိနစ် စမ်းကြည့်

Weather app (search TextField + Loading/Success/Error UI) ကို ကိုယ်တိုင် ဆောက်ကြည့်ပါ — city name မှားရိုက်ပြီး error state ကို ထွက်စေအောင် စမ်းကြည့်ပါ။

သတိလေးတစ်ချက်

API rate limit (free tier weather API တွေက request/day ကန့်သတ်ချက် ရှိလေ့ရှိပါတယ်) ကို သတိထားပါ — testing လုပ်ရင်း request ထပ်ခါထပ်ခါ ပို့ပြီး limit ကျော်သွားနိုင်ပါတယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • Error state ကို generic 'Something went wrong' message တစ်ခုတည်းနဲ့ ချန်ထားခြင်း — network error/city not found error ကို ခွဲခြားပြပေးရင် user ပိုနားလည်ပါတယ်
  • Loading state ကို emulator ရဲ့ fast network ပေါ်မှာသာ test လုပ်ခြင်း — slow/no network scenario ကို လည်း test လုပ်သင့်ပါတယ်

အခု ကိုယ်တိုင် စမ်းကြည့်

Weather app (search TextField + Loading/Success/Error UI) ကို ကိုယ်တိုင် ဆောက်ကြည့်ပါ — city name မှားရိုက်ပြီး error state ကို ထွက်စေအောင် စမ်းကြည့်ပါ။

You'll know it worked when: City name ရိုက်ထည့်ပြီး search ရင် loading spinner → weather data (ဒါမှမဟုတ် error message) ကို screen ပေါ်မှာ တွေ့ရမည်။

Project — Weather App (Retrofit + Coroutines) | Thuta Learning