如何将asynctask作为协同程序实现

o2gm4chl  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(266)

我有一个适配器类,在这里我使用了db。

class RestaurantRecycleAdapter(val context: Context, private var itemList: ArrayList<Restaurant>) :
    RecyclerView.Adapter<RestaurantRecycleAdapter.RestaurantViewHolder>() {
    class RestaurantViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        val txtFav: TextView = view.findViewById(R.id.favTextView)
        val txtRestaurantName: TextView = view.findViewById(R.id.txtFoodName)
        val txtRestaurantRating: TextView = view.findViewById(R.id.txtFoodRating)
        val txtRestaurantPrice: TextView = view.findViewById(R.id.txtFoodPrice)
        val restaurantImage: ImageView = view.findViewById(R.id.foodImageView)
        val rlContent: RelativeLayout = view.findViewById(R.id.rlContent)

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RestaurantViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.recycler_dashboard, parent, false)

        return RestaurantViewHolder(view)

    }

    override fun onBindViewHolder(holder: RestaurantViewHolder, position: Int) {

        val restaurant = itemList[position]
        val restaurantEntity = RestaurantEntity(restaurant.restaurantId, restaurant.restaurantName)

        holder.txtRestaurantName.text = restaurant.restaurantName
        holder.txtRestaurantRating.text = restaurant.restaurantRating
        holder.txtRestaurantPrice.text = "${restaurant.restaurantPrice}/Person"

        Picasso.get().load(restaurant.restaurantImage).error(R.drawable.restaurant_image)
            .into(holder.restaurantImage)

        holder.rlContent.setOnClickListener {
            val intent = Intent(context, RestaurantMenuActivity::class.java)
            intent.putExtra("restaurantId", restaurant.restaurantId)
            intent.putExtra("restaurantName", restaurant.restaurantName)
            intent.putExtra("restaurantImage",restaurant.restaurantImage.toString())
            intent.putExtra("restaurantPrice", restaurant.restaurantPrice.toString())
            intent.putExtra("restaurantRating", restaurant.restaurantRating.toString())
            context.startActivity(intent)
        }

      **val checkFav = DBAsyncTask(context, restaurantEntity, 1).execute()
        val isFav = checkFav.get()**

        if (isFav) {
            holder.txtFav.tag = "liked"
            holder.txtFav.background = context.resources.getDrawable(R.drawable.ic_fav_fill)
        } else {
            holder.txtFav.tag = "unliked"
            holder.txtFav.background = context.resources.getDrawable(R.drawable.ic_fav_outline)
        }

        holder.txtFav.setOnClickListener {
          **if (!DBAsyncTask(context, restaurantEntity, 1).execute().get()) {
                val result = DBAsyncTask(context, restaurantEntity, 2).execute().get()**
                if (result) {
                    StyleableToast.Builder(context).text("${restaurant.restaurantName} Added To Fav")
                        .textColor(Color.WHITE)
                        .iconStart(R.drawable.ic_favorite)
                        .length(100)
                        .backgroundColor(Color.RED)
                        .show()
                    holder.txtFav.tag = "liked"
                    holder.txtFav.background = context.resources.getDrawable(R.drawable.ic_fav_fill)
                } else {
                    Toast.makeText(
                        context,
                        "Database error. Please Try Again",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            } else {
              **val result = DBAsyncTask(context, restaurantEntity, 3).execute().get()**
                if (result) {
                    StyleableToast.Builder(context).text("${restaurant.restaurantName} Removed From Fav")
                        .textColor(Color.WHITE)
                        .iconStart(R.drawable.ic_favorite)
                        .length(100)
                        .backgroundColor(Color.RED)
                        .show()
                    holder.txtFav.tag = "unliked"
                    holder.txtFav.background =
                        context.resources.getDrawable(R.drawable.ic_fav_outline)
                } else {
                    Toast.makeText(
                        context,
                        "Database error. Please Try Again",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
        }

    }

    override fun getItemCount(): Int {
        return itemList.size
    }

}

我突出显示了我使用db的位置。
这是db类

class DBQueries(val context: Context, val restaurantEntity: RestaurantEntity, val mode: Int, application: Application) : AndroidViewModel(application) {

    private val db:RestaurantDatabase = RestaurantDatabase.getInstance(application)
    var flag: Boolean = true
    fun insert(): Boolean {
        viewModelScope.launch(Dispatchers.IO) {
            when(mode) {
                1 -> {
                    val restaurant: RestaurantEntity =
                        db.restaurantDao().getAllRestaurant(restaurantEntity.restaurant_Id)
                    db.close()
                    return@launch

                }

                2 -> {
                    db.restaurantDao().insertRestaurant(restaurantEntity)
                    db.close()
                    return@launch

                }

                3 -> {
                    db.restaurantDao().deleteRestaurant(restaurantEntity)
                    db.close()
                    return@launch

                }

            }

        }
        return false
    }
}

这是restaurantdatabase类:

@Database(entities = [RestaurantEntity::class], version = 1)
abstract class RestaurantDatabase : RoomDatabase() {
    abstract fun restaurantDao(): RestaurantDao

    companion object {
        private var INSTANCE: RestaurantDatabase? = null
        fun getInstance(context: Context): RestaurantDatabase {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(
                    context,
                    RestaurantDatabase::class.java,
                    "restaurant-db")
                    .build()
            }
            return INSTANCE as RestaurantDatabase
        }
    }
}

这实际上不能正常工作。这张单子不合适。我还想将asynctask更改为协同路由。我尝试通过扩展coroutinesscope并在类内调用globalscope来实现协同路由。但它根本不起作用。
请帮帮我

t1qtbnec

t1qtbnec1#

room支持协同路由,所以我想您必须声明挂起的函数和dao方法,而不是使用异步任务,您可以将这些方法移动到io,并使主线程安全。您可以在此处找到更多信息

class DBQueries() {
  val db = Room.databaseBuilder(context, RestaurantDatabase::class.java, "restaurant-db").build()
  suspend fun insertRestaurant(restaurantEntity: RestaurantEntity): Boolean  { 
    return withContext(Dispatchers.IO) {
      val restaurant: RestaurantEntity =
                db.restaurantDao().getAllRestaurant(restaurantEntity)
            db.close()
     restaurant != null
  }
}

为了将其与生命周期连接起来,您应该将单击事件移动到主视图(片段或活动),您可以为它或livedata使用一个接口。

相关问题