2015-09-22 2 views
0

мой вопрос очень прост: если я вставляю или обновляю или удаляю одну строку в базе данных SQLLite через ContentProvider из UIThread, нужна ли реализация AsyncQueryHandler?AsyncQueryHandler с ContentProvider необходим?

Я знаю, что наилучшей практикой является реализация операций CRUD в async-задаче, а также то, что кривая CRUD около одной строки не так тяжела для выполнения. Infact также Android Studio не предупреждает о его строении, которое не должно запускаться в потоке пользовательского интерфейса, и все руководства, которые я нашел в сети о ContentProvider, не упоминают ASyncQueryHandler. Все операции CRUD выполняются в потоке пользовательского интерфейса, вызываемого непосредственно ContentProvider.

+0

вы можете использовать '' CP' без AQH', но вы не можете использовать 'AQH' без' CP' – pskink

ответ

1

Возможно, лучше всего перейти по маршруту Async для всех ваших действий ContentProvider. Я знаю, что это может быть больно, но считайте это:

Ваша простая однострочная вставка, которая обычно занимает несколько миллисекунд, должна ждать завершения большей транзакции. Может быть, вы заняты в SyncAdapter, делая много вещей? Ваша маленькая крошечная вставка внезапно занимает гораздо больше времени и может даже вызвать ANR.

Я знаю, что это очень низкий шанс, но шанс все еще там. Гораздо лучше просто принять шаблонный код и получить с него ;-)

Пример шаблонный код для вставки в классе деятельности:

private class UpdateHandler extends AsyncQueryHandler { 

    private final WeakReference<YourActivityClass> mActivityRef; 

    public UpdateHandler(YourActivityClass activity, ContentResolver cr) { 
     super(cr); 

     mActivityRef = new WeakReference<>(activity); // do a weak reference incase the update takes ages and the activity gets destroyed during 
    } 

    @Override 
    protected void onUpdateComplete(int token, Object cookie, int result) { 
     super.onUpdateComplete(token, cookie, result); 

     YourActivityClass exampleActivity = mActivityRef.get(); 
     if (exampleActivity != null) { 
      exampleActivity .onUpdateCompleted(token); 
     } 
    } 
} 


public void saveStuffToDatabase() { 

    // do some stuff like show a progress bar or whatever 

    // actually do the update operation 
    new UpdateHandler(this, getContentResolver()).startUpdate(
      0,    // this will be passed to "onUpdatedComplete" in the updateHandler 
      null,   // so will this! 
      uri, 
      values 
    ); 


} 

private void onUpdateCompleted(int token) { 
    // this runs in the main thread after the update you started in saveStuffToDatabase() is complete 

} 
+0

Infact, я думаю то же самое. У вас есть хороший учебник по внедрению ASyncQueryHandler? – Lic

+0

Хорошо, как будто ты так хорошо спросил ... – JoeyJubb

Смежные вопросы