gpt4 book ai didi

Android ormlite : off the uithread

转载 作者:太空狗 更新时间:2023-10-29 16:18:06 24 4
gpt4 key购买 nike

我正在开始一个新的 Android 项目,并且想了解有关 OrmLite 的所有信息 + 使数据库访问远离 UI 线程。

OLD:在我的上一个项目中,我为每个插入/更新/删除调用使用了一个 ThreadPoolExecutor 和一个新的 AsyncTask 对象,因此这些调用将在 UI 线程之外执行。为了简单起见,我在 UI 线程上执行了选择请求。

新:在我的新应用中,我想在 UI 线程之外执行所有数据库调用。

在我的 Controller 类中使用 ThreadPoolExecutors 仍然可行吗? (我为每个模型对象使用一个单独的 Controller 类,它调用该对象的 DAO 方法并处理回调)。什么是最好的/新的选择?使用处理数据库访问的一个后台线程创建一项服务?

任何指向 Android + Ormlite + uid 线程最佳实践指南的链接都将不胜感激。

最佳答案

我推荐使用LoaderManager在后台从数据库中查询数据。

加载器中最简单的查询是:

public class CustomLoader extends AsyncTaskLoader<List<? extends DbBase>> {
private static final String LOG_TAG = CustomLoader.class.getSimpleName();

// DbBase is the parent class of all ORMLite data objects.
private List<? extends DbBase> mData;

public CustomLoader(Context context) {
super(context);
}

@Override
public List<? extends DbBase> loadInBackground() {
return DatabaseAdapter.getInstance().getORMLiteObjectDao().queryForAll();
}

@Override
public void deliverResult(List<? extends DbBase> data) {
if (isReset()) {
return;
}

mData = data;

if (isStarted()) {
super.deliverResult(data);
}
}

@Override
protected void onStartLoading() {
if (mData != null) {
deliverResult(mData);
}

if (takeContentChanged() || mData == null) {
forceLoad();
}
}

@Override
protected void onStopLoading() {
cancelLoad();
}

@Override
protected void onReset() {
// Ensure the loader has been stopped.
onStopLoading();

// At this point we can release the resources associated with 'mData'.
if (mData != null) {
mData = null;
}
}
}

因为我做了一些繁重的事务(更新/删除/插入),所以我使用了一个 ExecutorService,创建了一个缓存线程池并在执行器中执行了事务:

final Callable<SyncResult> transactionCall = new Callable<SyncResult>() {
@Override
public SyncResult call() throws Exception {
// do the sql magic
}
};

MyApplication.execute(new Runnable() {
@Override
public void run() {
try {
TransactionManager.callInTransaction(DatabaseAdapter.getInstance().getConnectionSource(), transactionCall);
} catch (SQLException e) {
Log.e(LOG_TAG, "Error in DB transaction", e);
}
}
});

由于长事务会导致数据库锁定,我建议启用“预写”(需要 API 11!)。

SQLiteDatabase db = mHelper.getWritableDatabase();
if (db != null && db.enableWriteAheadLogging()) { // requires API 11!
Log.d(LOG_TAG, "Write ahead enabled!");
mHelper.getRuntimeExceptionDao(ORMliteDataClass.class).queryRaw("PRAGMA journal_mode = \"WAL\"");
}

关于Android ormlite : off the uithread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21983248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com