当前位置: 首页 > 知识库问答 >
问题:

使用RxJava在主线程室中执行delete

汪理
2023-03-14

我使用的房间用于存储有关购物车详细信息。

我想删除主线程中的记录。我出错了

无法访问主线程上的数据库,因为它可能会长时间锁定

我检查了下面的链接,但没有帮助我

使用room(rxjava)执行删除

如何在android room和rxjava 2中插入数据并获取id作为out参数?

道阿ccess.java

    @Dao
    public interface DaoAccess {

        @Insert
        void insertMultipleRecord(DBProducts... universities);

        @Insert
        void insertMultipleListRecord(List<DBProducts> universities);

        @Insert
        void insertOnlySingleRecord(DBProducts university);


        @Query("SELECT * FROM DBProducts")
        LiveData<List<DBProducts>> fetchAllData();


        @Update
        void updateRecord(DBProducts university);

        @Delete
        void deleteRecord(DBProducts university);
    }

应用班

    public class PRApp extends Application {
        private static PRApp m_instance;
        DBHelper dbHelper;

        @Override
        public void onCreate() {
            super.onCreate();
            mInstance = this;
            prefs = new PRPrefs(this);
            m_instance = this;

            sDefSystemLanguage = Locale.getDefault().getLanguage();
            switch (sDefSystemLanguage) {
                case "en":
                    sDefSystemLanguageCode = "1";
                    break;
                case "ar":
                    sDefSystemLanguageCode = "2";
                    break;
                default:
                    sDefSystemLanguageCode = "3";
                    break;
            }
        }


        public DBHelper getRoomDB() {
            dbHelper = Room.databaseBuilder(getApplicationContext(),
                    DBHelper.class, "prasukh-db").build();
            return dbHelper;

        }



    }

我的异步任务正在工作

    new AsyncTask<Void, Void, Integer>() {
                    @Override
                    protected Integer doInBackground(Void... params) {
                        PRApp.getInstance().getRoomDB().daoAccess().deleteRecord(products.get(position));
                        return 0;
                    }

                    @Override
                    protected void onPostExecute(Integer agentsCount) {
                        Utilities.decrementBadegeCount();
                        productsArrayList.remove(position);
                        cardAdapter.notifyDataSetChanged();
                        notifyDataSetChanged();
                        hideProgressDialog();
                        setCartLayout();
                    }
                }.execute();

如何在RxJava中实现这一点。因为我的DAO删除返回无效?

共有1个答案

郑哲彦
2023-03-14

使用可调用的运算符。

Observable.fromCallable(() -> {
    PRApp.getInstance().getRoomDB().daoAccess().deleteRecord(products.get(position));
    return true;
}).firstOrError()
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .subscribe(new SingleObserver<List<String>>() {

          @Override
          public void onSubscribe(Disposable d) {

          }

          @Override
          public void onSuccess(List<String> strings) {

          }

          @Override
          public void onError(Throwable e) {

          }

      });
      // or only
      .subscribe()
      // But if an error occurred  in delete operation the app will crash

这将执行删除操作并生成可观察的

或者,您可以使用

Room.databaseBuilder(getApplicationContext(),DBHelper.class, "prasukh-db")
        .allowMainThreadQueries()
        .build();

但这是因为表演而不被鼓励的。

 类似资料:
  • 在房间中,删除注释不会发出任何信息。这就是dao的样子 这使得它在做类似的事情时成为一个问题 因为我们没有的发射。我使用以下代码在后台线程上调用deleteUser。 这工作正常。但是,在订阅方法中,我现在需要访问AndroidUI来显示一个宣布成功删除的祝酒词。自然,我得到了这个异常(因为链中缺少观察) 然而,当我像这样放置观察 我奇怪地发现了这个例外:

  • 本文向大家介绍iOS 在主线程上执行,包括了iOS 在主线程上执行的使用技巧和注意事项,需要的朋友参考一下 示例 当异步执行任务时,通常需要确保在主线程上运行一段代码。例如,您可能要异步访问REST API,但将结果放在屏幕上的UILabel中。在更新UILabel之前,必须确保您的代码在主线程上运行: 每当您更新屏幕上的视图时,请始终确保您正在主线程上执行此操作,否则可能会发生未定义的行为。

  • 问题内容: 我刚刚遇到了这个“错误”,但是我不确定这是否是故意的:代码: 在第一个示例中,它是在swing线程上执行的,但在第二个示例中,它不是,尽管我认为应该这样做。 这是错误还是故意的? 问题答案: 在我看来,这似乎是您的误解 第一行就像在说:“好吧,秋千,我想要你做的是”。所以Swing执行它 第二行就像是说:“确定,Swing,我要您执行的是方法返回的对象的方法”。一个是方法, 我现在执行

  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....

  • 问题内容: 我有一个处理来自.NET Remoting的异步回调的Python脚本。这些回调在虚拟(工作)线程中执行。从我的回调处理程序内部,我需要调用在脚本中定义的函数,但需要在主线程中执行该函数。 主线程是将命令发送到服务器的远程客户端。其中一些命令会导致异步回调。 基本上,我需要等效于.NET的Invoke方法。这可能吗? 问题答案: 您想使用Queue(现在是python 3的队列)类来设