房间运行非常缓慢

7
我正在尝试使用Room Persistence Library获取/存储数据。从表中获取所有数据的调用速度非常慢,我使用nanoTime计时,大约需要1800ms,我认为这太慢了。可能出了什么问题?
以下是更多信息:
1. 表中只有20-30个条目。 2. 20个字段,其中一些由Gson序列化。Gson不是瓶颈(nanoTime表示)。 3. 测试设备运行6.0(Xperia M5)。 4. Room v1.1.1 5. 使用AsyncTask运行查询。
查询在DbDao中定义。
@Query("SELECT * FROM events")
List<Event> getAllEvents();

你能找出出了什么问题吗? - coding_idiot
1个回答

4
异步任务不适合处理Room数据库。建议您使用执行器,使用此方法创建单例类。代码如下。 import android.os.Looper; import android.support.annotation.NonNull;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

public class AppExecutor {
    private static final Object LOCK = new Object();
    private static AppExecutor sInstance;
    private final Executor diskIO;
    private final Executor mainThread;
    private final Executor networkIO;

    public AppExecutor(Executor diskIO, Executor mainThread,
                       Executor networkIO) {
        this.diskIO = diskIO;
        this.mainThread = mainThread;
        this.networkIO = networkIO;
    }

    public static AppExecutor getInstance() {
        if (sInstance == null) {
            synchronized (LOCK) {
                sInstance = new AppExecutor(Executors.newSingleThreadExecutor(),
                      Executors.newFixedThreadPool(3), new MainThreadExecutor());
            }
        }
        return sInstance;
    }

    public Executor diskIO() {
        return diskIO;
    }

    public Executor mainThread() {
        return mainThread;
    }

    public Executor networkIO() {
        return networkIO;
    }

    private static class MainThreadExecutor implements Executor {
        private android.os.Handler mainThreadHandler =
                new android.os.Handler(Looper.getMainLooper());

        @Override
        public void execute(@NonNull Runnable runnable) {
        }
    }
}

现在,在创建了这个新类之后,请在appexecutor线程中完成所有数据库访问功能。这比使用异步任务和内置的Java线程库更好。另外,请确保任何数据访问功能不要在UI线程上运行。 如果您发布了更多代码,我将能够准确定位问题所在。 最后,请按以下方式在您的代码中使用此方法-
AppExecutor.getInstance().diskIO().execute(new Runnable() {
    @Override
    public void run() {
        ///Your data access task////
    }
});

1
这比使用异步任务和内置的Java线程库更好。怎么做呢? - Zun
正如您所看到的,我正在使用线程池执行器。线程池解决了两个不同的问题:它们通常在执行大量异步任务时提供了更好的性能,由于减少了每个任务调用的开销,并且它们提供了一种管理资源(包括线程)的方式,以便在执行任务集合时消耗这些资源。简单来说,我们知道在手机上保存数据并检索数据是一个相当繁琐的任务,对于异步任务来说也是如此。此外,执行器是Android架构组件的主要部分,性能比异步任务要好得多。 - Aryan Soni
Java线程库也可能很难管理。线程池执行器可以完成所有管理工作。 - Aryan Soni
谢谢你的回答,假设在后台运行的数据访问任务已经完成,我应该怎么更新UI呢?我可以直接调用runOnUithread吗?还是有更好的替代方法?@AryanSoni - Ahmed Rajab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接