I am trying to insert data in RoomDb but at the the time of data insertion app is crashing even if I am writing insertion operation in thread.I have a recycler view adapter class in which I have a click listener based on that I want to add data in RoomDb.
Here is my logcat error:
java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
Below is my code:
ProductAdapter.class
public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder> {
List<Product> productList;
Context context;
public ProductAdapter(List<Product> productList, Context context) {
this.productList = productList;
this.context = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_row,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Product product = productList.get(position);
holder.productName.setText(product.getName());
holder.productPrice.setText(product.getPrice());
Glide.with(context).load(product.getProduct_image()).placeholder(R.color.teal_200).into(holder.productImage);
holder.productCard.setAnimation(AnimationUtils.loadAnimation(context,R.anim.recycler_anim));
holder.addToCart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.tick.setVisibility(View.VISIBLE);
holder.addToCart.setVisibility(View.INVISIBLE);
((AppCompatActivity)context).runOnUiThread(new Runnable() {
@Override
public void run() {
ProductDb db = ProductDb.getInstance(context);
CartProduct cartProduct = new CartProduct(product.get_id(),product.getName(),product.getProduct_image(),
product.getPrice(),"1");
db.productDao().insert(cartProduct);
}
});
}
});
}
@Override
public int getItemCount() {
return productList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView productImage,addToCart,tick;
TextView productName,productPrice;
CardView productCard;
public ViewHolder(@NonNull View itemView) {
super(itemView);
productImage = itemView.findViewById(R.id.productImage);
productName = itemView.findViewById(R.id.productName);
productPrice = itemView.findViewById(R.id.productPrice);
productCard = itemView.findViewById(R.id.productCard);
tick = itemView.findViewById(R.id.tick);
addToCart = itemView.findViewById(R.id.addToCart);
}
}
}
How can I overcome this issue?