استفاده از Retrofit در ViewModel اندروید
در توسعه مدرن اپلیکیشنهای اندرویدی، یکی از مهمترین چالشها مدیریت درخواستهای شبکه و نمایش دادهها در رابط کاربری است. اگر ارتباط بین UI و لایه شبکه بهدرستی طراحی نشود، پروژه بهمرور پیچیده، غیرقابل نگهداری و پر از کدهای تکراری خواهد شد.
اینجاست که ترکیب معماری MVVM با کتابخانه Retrofit و ViewModel اهمیت پیدا میکند. این ساختار به شما کمک میکند کدی تمیز، ماژولار و قابل تست بنویسید.
در این مقاله، بهصورت کامل یاد میگیرید چگونه Retrofit را داخل ViewModel استفاده کنید و دادهها را به رابط کاربری منتقل نمایید.
معماری MVVM چیست؟
الگوی MVVM مخفف:
- Model
- View
- ViewModel
است.
در این معماری:
- View فقط مسئول نمایش UI است
- Model مسئول مدیریت دادههاست
- ViewModel واسط بین View و Model است
مزیت اصلی این معماری، جداسازی منطق برنامه از رابط کاربری است.
Retrofit چیست؟
Retrofit یک REST Client قدرتمند برای اندروید است که توسط Square توسعه داده شده و برای ارسال درخواستهای HTTP و دریافت داده از API استفاده میشود.
Retrofit:
- درخواستها را ساده میکند
- JSON را به Object تبدیل میکند
- با Coroutine و Flow سازگار است
ساختار پروژه
در این آموزش ساختار زیر را پیادهسازی میکنیم:
UI → ViewModel → Repository → Retrofit API
مرحله 1: افزودن وابستگیها
در فایل build.gradle:
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.0"
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3"
مرحله 2: ساخت Data Model
فرض کنید API لیست پستها را برمیگرداند:
data class Post(
val userId: Int,
val id: Int,
val title: String,
val body: String
)
مرحله 3: ساخت Interface API
import retrofit2.http.GET
interface ApiService {
@GET("posts")
suspend fun getPosts(): List<Post>
}
مرحله 4: ساخت Retrofit Instance
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitInstance {
private const val BASE_URL =
"https://jsonplaceholder.typicode.com/"
val api: ApiService by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(
GsonConverterFactory.create()
)
.build()
.create(ApiService::class.java)
}
}
مرحله 5: ساخت Repository
Repository مسئول دریافت داده از API است.
class PostRepository {
suspend fun getPosts(): List<Post> {
return RetrofitInstance.api.getPosts()
}
}
مرحله 6: استفاده از Retrofit داخل ViewModel
اینجا بخش اصلی کار است.
import androidx.lifecycle.*
import kotlinx.coroutines.launch
class PostViewModel : ViewModel() {
private val repository = PostRepository()
private val _posts = MutableLiveData<List<Post>>()
val posts: LiveData<List<Post>> = _posts
fun fetchPosts() {
viewModelScope.launch {
try {
val result = repository.getPosts()
_posts.value = result
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}
چرا از viewModelScope استفاده میکنیم؟
viewModelScope یک Coroutine Scope مخصوص ViewModel است.
مزایا:
- جلوگیری از Memory Leak
- لغو خودکار Coroutine هنگام Destroy شدن ViewModel
- مدیریت آسان Async Taskها
مرحله 7: نمایش دادهها در Activity
class MainActivity : AppCompatActivity() {
private lateinit var viewModel: PostViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this)
.get(PostViewModel::class.java)
viewModel.fetchPosts()
viewModel.posts.observe(this) { posts ->
println(posts)
}
}
}
مدیریت وضعیت Loading و Error
در پروژههای واقعی باید وضعیتها را مدیریت کنید.
ساخت کلاس Result
sealed class Resource<T>(
val data: T? = null,
val message: String? = null
) {
class Loading<T> : Resource<T>()
class Success<T>(data: T)
: Resource<T>(data)
class Error<T>(message: String)
: Resource<T>(message = message)
}
استفاده در ViewModel
private val _state =
MutableLiveData<Resource<List<Post>>>()
val state: LiveData<Resource<List<Post>>> =
_state
استفاده از StateFlow (روش مدرن)
بهجای LiveData میتوانید از:
- Kotlin Flow
- StateFlow
استفاده کنید.
مثال:
private val _posts =
MutableStateFlow<List<Post>>(emptyList())
val posts = _posts.asStateFlow()
مزایای استفاده از Retrofit در ViewModel
✅ جداسازی لایهها
UI مستقیماً با API کار نمیکند.
✅ تستپذیری بهتر
ViewModel بهراحتی Unit Test میشود.
✅ مدیریت بهتر Lifecycle
بدون Memory Leak.
✅ کد تمیزتر
مطابق Clean Architecture.
اشتباهات رایج
❌ ارسال Request داخل Activity
اشتباه:
RetrofitInstance.api.getPosts()
داخل Activity.
❌ عدم مدیریت خطا
همیشه:
- Timeout
- قطع اینترنت
- خطاهای سرور
را مدیریت کنید.
معماری حرفهای پیشنهادی
پروژههای حرفهای معمولاً از این ساختار استفاده میکنند:
Presentation
└── ViewModel
Domain
└── UseCase
Data
├── Repository
└── Retrofit API
جمعبندی
ترکیب Retrofit با ViewModel و معماری MVVM یکی از بهترین روشها برای مدیریت درخواستهای شبکه در اندروید است.
این ساختار:
- کد را تمیزتر میکند
- نگهداری پروژه را سادهتر میکند
- تستپذیری را افزایش میدهد
- از مشکلات Lifecycle جلوگیری میکند
اگر قصد توسعه اپلیکیشنهای حرفهای اندرویدی را دارید، یادگیری این ساختار کاملاً ضروری است.