【问题标题】:Difference between Android AsyncTask and realm.executeTransactionAsyncAndroid AsyncTask 和 realm.executeTransactionAsync 的区别
【发布时间】:2016-07-12 20:20:25
【问题描述】:

我是 Realm 世界的新手,我遇到了麻烦。我的 Android 应用程序中有一个动画,并且在数据库进程正在运行并且我的动画冻结时显示。 我认为可能是因为我的数据库进程在运行到这样的 AsyncTask 中:

    new AsyncTask<Void, Void, Void>() {
                @Override
                protected Void doInBackground(Void... params) {
                    //HERE IS MY CODE TO SAVE DATA
                    return null;
                }

                @Override
                protected void onPostExecute(Void result) {

                }
            }.execute();

我想知道 Android 的 AsyncTask 和 realm.executeTransactionAsync(...) 之间是否有一些区别。方法 executeTransactionAsync 防止 UI 冻结?

【问题讨论】:

    标签: android multithreading android-asynctask realm


    【解决方案1】:

    动画在主线程上运行,而 AsyncTask 不在(在单独的线程上运行)。

    我的动画冻结了。我想可能是因为我的数据库进程在运行到一个AsyncTask

    这种情况不太可能发生。

    在 Realm 提供的异步事务中执行数据库事务当然比将事务包装在您自己创建的异步任务中更好(至少在概念上)。

    为异步事务切换异步任务不会解决您的问题。

    【讨论】:

      【解决方案2】:

      我相信您的问题与AsyncTaskrealm.executeTransactionAsync 之间的差异无关,它们做同样的工作(如果您以正确的方式扩展AsyncTask),如果您确定所有交易都在背景你应该在其他地方寻找问题(一些在主线程上运行的长任务),你发布的代码没什么可说的,但作为一个提示:

      AsyncTaskRealm(异步事务)都使用 ThreadPoolExecutor,但有一些区别:

      雷拉姆:

      private static final int CORE_POOL_SIZE = Runtime.getRuntime().availableProcessors() * 2 + 1;
      private static final int QUEUE_SIZE = 100;
      
      ThreadPoolExecutor THREAD_POOL_EXECUTOR = ThreadPoolExecutor(CORE_POOL_SIZE, CORE_POOL_SIZE,
           0L, TimeUnit.MILLISECONDS, //terminated idle thread
           new ArrayBlockingQueue<Runnable>(QUEUE_SIZE));
      

      异步任务:

      private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
      private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
      private static final int KEEP_ALIVE = 1;
      private static final ThreadFactory sThreadFactory = new ThreadFactory() {
          private final AtomicInteger mCount = new AtomicInteger(1);
      
          public Thread newThread(Runnable r) {
              return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
          }
      };
      
      private static final BlockingQueue<Runnable> sPoolWorkQueue =
              new LinkedBlockingQueue<Runnable>(128);
      
      public static final Executor THREAD_POOL_EXECUTOR
              = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
                      TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
      

      【讨论】:

        【解决方案3】:

        我从未使用过领域,但根据下面的文档,“executeTransactionAsync”用于“在后台线程上异步更新对象”,所以我认为这回答了您的问题。

        来源:

        https://realm.io/docs/java/latest/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-02
          • 1970-01-01
          • 2012-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多