【问题标题】:How to use ExecutorService with Android Room?如何在 Android Room 中使用 ExecutorService?
【发布时间】:2020-09-22 21:16:15
【问题描述】:

我将 ExecutorService 与 Android Room 一起使用,以避免 insetAsyncTasks 中出现多个。我在这篇文章中使用了 Debanjan 示例:link,但我对其进行了一些修改。

问题是我没有得到任何异常但没有插入任何内容。

DaoAsyncProcessor:

public abstract class DaoAsyncProcessor<T> {

public interface DaoProcessCallback<T>{
    void  onResult(T result);
}

private DaoProcessCallback daoProcessCallback;

public DaoAsyncProcessor(DaoProcessCallback daoProcessCallback) {
    this.daoProcessCallback = daoProcessCallback;
}

protected abstract T doAsync();

public void start(){
    new DaoProcessAsyncTask().execute();
}

private class DaoProcessAsyncTask extends AsyncTask<Void, Void, T> {

    @Override
    protected T doInBackground(Void... params) {
        return doAsync();
    }

    @Override
    protected void onPostExecute(T t) {
        if(daoProcessCallback != null)
            daoProcessCallback.onResult(t);
    }
}
}

存储库:

public void createUpdate(final Projects item){
    EncertDatabase.databaseWriteExecutor.execute(() ->{
        if(item!=null){
            if(item.getId()==null){
                encertDAO.insert(item);
            }
            else {
                encertDAO.update(item);
            }
        }else {
            Log.e("Krkec", "Item was null");
        }

    });
}

数据库:

public abstract class EncertDatabase extends RoomDatabase {
private static  volatile EncertDatabase INSTANCE;
public  abstract EncertDAO encertDAO();

private static final int NUMBER_OF_THREADS = 4;
public static final ExecutorService databaseWriteExecutor =
        Executors.newFixedThreadPool(NUMBER_OF_THREADS);

public static  EncertDatabase getDatabase(final Context context){
    if(INSTANCE== null){
        synchronized (EncertDatabase.class){
            if (INSTANCE ==null){
                INSTANCE = Room.databaseBuilder(context.getApplicationContext(), EncertDatabase.class,"encertDatabase").fallbackToDestructiveMigration().build();
            }
        }
    }
    return INSTANCE;
}
}

我做错了什么?

【问题讨论】:

    标签: android executorservice room


    【解决方案1】:

    使用 setQueryExecutor 将执行器服务实例分配给 db builder 实例

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-18
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多