Лучше использовать AsyncTask для записи данных в базу данных или нет? - PullRequest
0 голосов
/ 25 июня 2018

Вот мой вопрос: у меня есть приложение, которое должно выполнять операцию записи в базу данных SQLite, один раз в секунду, лучше использовать AsyncTask для записи данных в эту базу данных или нет?

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();
}

БД реализована с использованием SqLiteClass.

. Приложение выполняет тяжелые задачи, работая с живыми данными, веб-сокетом, картой Google и т. Д., Поэтому я хочу оптимизировать этот вопрос.точка.

Я не знаю, лучше ли запускается asyncTask один раз в секунду, я могу ошибиться и ошибиться, поэтому мы можем говорить об этом.

Заранее спасибо.

Ответы [ 3 ]

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

Не вставляйте данные в основной поток. Если ваши данные велики, возможно, они зависли в MainThread.лучше вставлять в фоновый поток, используя AsyncTask, Handler, стороннюю библиотеку RxJava.и должен использовать beginTransaction ().

public void dbInsert()
{
    db.beginTransaction(); 
       //do your insertion.
     db.setTransactionSuccessful(); 
    db.endTransaction();
}
0 голосов
/ 25 июня 2018

На вашем месте я бы использовал для этого специальный HandlerThread.Видео-сериал Android Performance от Google рекомендует использовать его, когда вам нужно выполнить значительное количество операций, и их можно разбить на части.Вы могли бы сделать что-то вроде этого:

//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

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

Да, рекомендуется использовать операцию базы данных в фоновом потоке. Вы можете рассмотреть возможность использования AsyncTask или Handler для обработки операций с БД в фоновом потоке вместо того, чтобы помещать это в основной поток пользовательского интерфейса.

Вам также может быть интересно получить обновление вашей базы данных при изменении или вставке элемента в таблицу базы данных. Вы можете рассмотреть возможность использования обозревателя контента, чтобы получать уведомления об изменениях контента в таблице базы данных. Пожалуйста, проверьте функции LoaderCallbacks.

Я создал проект в Github здесь , чтобы продемонстрировать операции с базой данных, используя LoaderCallbacks. Тем не менее, я поместил все операции с базой данных в поток пользовательского интерфейса. Лучше обрабатывать их внутри другого потока, используя AsyncTask или Handler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...