2016-07-12 29 views
1

私はRealmの世界では新しく、困っています。 Androidアプリケーションにアニメーションがあり、データベースプロセスが実行中で、アニメーションがフリーズしている間に表示されます。私はAndroidのAsyncTaskとrealm.executeTransactionAsync(...)の間にいくつかの違いを持っ​​ているかどうかを知りたいAndroid AsyncTaskとrealm.executeTransactionAsyncの違い

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(); 

: 私はそのようAsyncTaskに実行しているの私のデータベース・プロセスので、することができると思います。メソッドexecuteTransactionAsyncはUIのフリーズを防止しますか?

答えて

0

レルムを使用したことはありませんが、以下のドキュメントに従って「executeTransactionAsync」は「バックグラウンドスレッドでオブジェクトを非同期に更新する」ために使用されます。

出典:

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

2

アニメーションは、メインスレッド上で実行され、AsyncTaskは(別のスレッドで実行されます)しません。

私のアニメーションはフリーズしています。私は、AsyncTaskを実行している私のデータベースプロセスのためだと思う。

これはほとんどありません。

Realmが提供する非同期トランザクションでデータベーストランザクションを実行することは、あなたが自分で行ったasynctaskでトランザクションをラップするよりも(少なくともコンセプト上)良い方法です。

asyncctaskを非同期トランザクションに切り替えても、問題は解決されません。

1

私はあなたがすべてのトランザクションがバックグラウンドで実行されていることを確認している場合は、探さなければならない、あなたの問題は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)); 

AsyncTask:

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);