这是我的问题:我有一个应用程序需要每秒对SQLite数据库执行一次写操作,是否最好使用AsyncTask在该数据库上写数据?
root
该数据库是通过使用public void insertData(Data data) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues RecordValues = new ContentValues();
RecordValues.put("uid", data.getUid());
RecordValues.put("id_usr", data.getUserId());
RecordValues.put("id_route", data.getIdRoute());
RecordValues.put("lat", data.getLatitude());
RecordValues.put("lng", data.getLongitude());
RecordValues.put("timestamp", data.getTime());
RecordValues.put("privacy", data.getTime());
db.insert("DBNAME", null, RecordValues);
db.close();
}
来实现的。
该应用程序需要处理一些繁重的任务,包括实时数据,网络套接字,谷歌地图等,因此我想在这一点上进行优化。
我不知道每秒启动一次asyncTask是否更好,我可能会犯一个错误,因此我们可以谈谈。
谢谢。
答案 0 :(得分:1)
是的,建议将数据库操作放在后台线程中。您可能考虑使用AsyncTask
或Handler
在后台线程中处理数据库操作,而不是将其放在主UI线程中。
您可能还对在更改或向数据库表中插入项目时获取数据库更新感到好奇。您可能会考虑使用内容观察器来获取有关数据库表中内容更改的通知。请检查LoaderCallbacks
功能。
我在Github here中创建了一个项目,以演示使用LoaderCallbacks
的数据库操作。但是,我已将所有数据库操作都放在UI线程中。最好使用AsyncTask
或Handler
在另一个线程中处理它们。
答案 1 :(得分:1)
请勿在主线程中插入数据。如果您的数据很大,则可能会挂断MainThread。 最好使用AsyncTask,Handler,第三方库RxJava将其插入后台线程。 并且必须使用beginTransaction()。
public void dbInsert()
{
db.beginTransaction();
//do your insertion.
db.setTransactionSuccessful();
db.endTransaction();
}
答案 2 :(得分:1)
如果我是我,那么我将为此使用专用的HandlerThread。当您需要执行大量操作并且可以将它们分成几部分时,Google建议使用Android Performance视频系列。您可以执行以下操作:
//make sure you have one instance of this HandlerThread
private HandlerThread updateThread = acquireThisThread();
private Handler updateHandler;
private void someInitializingFunction() {
updateThread.start()
updateHandler = new Handler(updateThread.getLooper())
}
private void onEachSecondCallback() {
updateHandler.post(new Runnable() {
@Override
public void run() {
//your insertingDataFunction
insertData(getDataSomehow());
}
});
}
private void someDeinitializingFunction() {
updateThread.quit();
}
在这里,您具有指向性能视频的链接。它使用了完全不同的示例,但是如果您以此为基础,将会明白HandlerThread在这里很酷的原因。 https://www.youtube.com/watch?v=adPLIAnx9og