Blog top image

Suspended function


suspended কী ওয়ার্ড একটা মেথডকে এসিনক্রনাস বানায়।  মানে হচ্ছে মেথড মেইন থ্রেডে না চলে আলাদা থ্রেডে চলে, সার্ভার কমিউনিকেশন এর ক্ষেত্রে suspended মেথড ব্যবহার করলে এপ্লিকেশন ডাটা আদান প্রদান করার জন্য থেমে থাকে না, ফলে অ্যাপ্লিকেশনকে রিস্পনসিভ মনে হয়।  এক্ষেত্রে একটা সমস্যায় হচ্ছে, মেইন থ্রেড থেকে মেথডের রিটার্ন ডাটাকে সরাসরি এককেস করা যায় না। 

উদাহরণ 

    suspend fun getAll(): ApiResponse<List<Reminder>> {
        return processResponse(reminderApi.findAll())
    }


তাই, ডাটাকে  suspended  ফাংশন থেকে আবার মেইন মেথডে আনতে viewModelScope.launch স্কোপ ব্যবহার করা যেতে পারে 

private val _reminderList = MutableStateFlow(listOf<Reminder>())
val reminderList = _reminderList

fun findAll() {
        viewModelScope.launch {
            try {
                when (val result = reminderRepository.getAll()) {
                    is ApiResponse.Success -> {
                        _reminderList.value = result.data
                    }
                    is ApiResponse.Error -> {
                        error.value = ApiResponse.Error(result.status, result.message, result.errors)
                    }
                }
            } catch (e: Exception) {
                error.value = generateServerError(e)
            }
        }
    }