Асинхронная задача не подходит для обработки базы данных 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////
}
});
}