Комната работает очень медленно - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь получить / сохранить данные с помощью Библиотеки постоянства комнат. Вызовы для получения всех данных из таблицы очень медленные, и я рассчитал, что nanoTime составляет около 1800 мс, что я считаю слишком медленным. Что может быть не так?

Вот еще немного информации:

  1. В таблице всего 20-30 записей.
  2. 20 полей, некоторые сериализуются Gson. Гсон не является узким местом (говорит nanoTime)
  3. Тестовое устройство работает 6.0 (Xperia M5)
  4. Комната v1.1.1
  5. Запросы выполняются с использованием AsyncTask

Запрос определен в DbDao как

@Query("SELECT * FROM events")
List<Event> getAllEvents();

1 Ответ

0 голосов
/ 30 июня 2018

Асинхронная задача не подходит для обработки базы данных Room. Я бы предложил вам использовать executor и создать синглтон-класс, используя это. Код выглядит следующим образом.

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. Также убедитесь, что все функции доступа к данным не работают в потоке пользовательского интерфейса. Если вы разместите больше кода, я смогу точно определить проблему. И последнее, используйте это в своем коде следующим образом:

AppExecutor.getInstance().diskIO().execute(new Runnable() {
@Override
 public void run() {
           ///Your data access task////
   }
   });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...