برنامه‌نویسی اندروید

استفاده از Retrofit در ViewModel اندروید

استفاده از 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 جلوگیری می‌کند

اگر قصد توسعه اپلیکیشن‌های حرفه‌ای اندرویدی را دارید، یادگیری این ساختار کاملاً ضروری است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *