Итак, я использовал механизм сохранения комнат для моего приложения Android, и вот мой код для обновления базы данных после сбора некоторых данных из пользовательского ввода:
new AsyncTask<Product,Void,Void>() {
@Override
protected Void doInBackground( Product ... newProducts ) {
Producer q= new Producer();
q.setName(nm);
MyDatabase.getDatabase(getActivity()).myDao().insertProducers(q);
int id= MyDatabase.getDatabase(getActivity()).myDao().getProducerByName(nm).getId();
Product p= newProducts[0];
p.setProducerId(id);
MyDatabase.getDatabase(getActivity()).myDao().insertProducts(p);
id= MyDatabase.getDatabase(getActivity()).myDao().getProductByUpc(p.getUpcCode())[0].getId();
for ( Packaging x: packagings )
x.setProductId(id);
Packaging[] array= new Packaging[packagings.size()];
for ( int i= 0; i < packagings.size(); ++i )
array[i]= packagings.get(i);
MyDatabase.getDatabase(getActivity()).myDao().insertPackagings(array);
return null;
}
}.execute(p);
Так как я где-то читалчто @Dao
выполняет некоторые запросы в другом потоке по умолчанию, теперь я вижу, что приведенный выше код нельзя доверять для последовательного выполнения.Я отказался от действий в onPreExecute()
и onPostExecute()
, так как по документации они выполняются в потоке пользовательского интерфейса.Итак, ответ на мой вопрос - использовать вложенные AsyncTask
s?Это хорошая практика, или она соответствует тому, что я пытаюсь выполнить в приведенном выше коде?