暂停功能不会在foreach中恢复

时间:2020-05-13 20:20:29

标签: android kotlin android-room coroutine

我正在Android项目中使用Room Persistence Library。 ViewModel类:

class ShoppingListsViewModel(
    private val toBuyProductRepository: ToBuyProductRepository,
    private val shoppingListRepository: ShoppingListRepository,
    private val productRepository: ProductRepository
) : ViewModel() {

fun addShoppingListWithProductsToBuy(listName: String) {
        viewModelScope.launch {
            val listId: Long = shoppingListRepository.insertList(ShoppingList(listName))
            val productsToBuy: List<ToBuyProduct> = toBuyProductRepository.getAllProductsNLD()

            productsToBuy.forEach {
                productRepository.insert(
                    Product(
                        ProductDetails(productName = it.name),
                        listId
                    )
                )
            }
        }
    }
}

存储库:

class ShoppingListRepository(
    private val shoppingListDao: ShoppingListDao
) {

    suspend fun insertList(list: ShoppingList): Long = shoppingListDao.insertList(list)
}
class ToBuyProductRepository(
    private val toBuyProductDao: ToBuyProductDao
) {

    suspend fun getAllProductsNLD(): List<ToBuyProduct> = toBuyProductDao.getAllProductsNLD()
}
class ProductRepository(
    private val productDao: ProductDao
) {
    suspend fun insert(product: Product) = productDao.insert(product)
}

DAO:

@Dao
interface ShoppingListDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertList(list: ShoppingList): Long
}
@Dao
interface ToBuyProductDao {

    @Query("SELECT * FROM tobuyrecord")
    suspend fun getAllProductsNLD(): List<ToBuyProduct>
}
@Dao
interface ProductDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(product: Product)
}

问题与功能addShoppingListWithProductsToBuy有关。 toBuyProductRepository.getAllProductsNLD()始终返回有效列表。但是productsToBuy.forEach中的迭代次数是随机的,并且不取决于productsToBuy的大小。协程似乎在productRepository.insert上暂停了一段时间,再也没有恢复。

0 个答案:

没有答案