2016-12-13 1 views
0

Возможно ли, что ОС Android может по какой-то причине отложить или приостановить мою асинтезку. Если да, то что я могу сделать, чтобы моя задача (например, выборка данных из базы данных) не была отложена или приостановлена. Возможно, запустите его в потоке пользовательского интерфейса, но я прочитал, что это не очень хорошая идея, так как он может заморозить пользовательский интерфейс и вызвать задержку.Может андроид задержать или приостановить мою задачу асинхронного?

+0

При каких обстоятельствах это затягивает или приостанавливает выполнение вашей задачи? – Victory

+0

Я извлекаю данные из базы данных и заполняю список. Я извлекаю данные с помощью задачи async и сохраняю их в arraylist после завершения задачи async. Я вызываю notifyDataSetChanged() в функции onPostExecute() для обновления адаптера listview. В большинстве случаев список загружается нормально, но иногда есть задержка (я вижу пустой экран), и через некоторое время список будет обновляться. –

+1

Как вы уверены, что его ожидалось не просто дольше, чтобы получить из базы данных? Диск io может быть медленным. – Victory

ответ

2

Возможно ли, что ОС Android может отложить или приостановить свою AsyncTask по какой-то причине.

Может быть заблокирован другим экземпляром AsyncTask. По умолчанию они работают на одном фоновом потоке: https://developer.android.com/reference/android/os/AsyncTask.html

Если это так, что я могу сделать, чтобы гарантировать, что моя задача (например выборки данных из базы данных) не задерживается или приостановить.

Исследуйте, что именно вызывает задержку. Это что-то внутри метода doInBackground или, может быть, задержки происходят до или после фоновой операции. Это может быть что угодно, трудно сказать, не отлаживая код.

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

Хотя AsyncTask не является хорошим решением в этом случае, он должен работать нормально, если вы его правильно реализуете. Другие подходы к рассмотрению будут Loader с, или AsyncQueryHandler с ContentProvider. Зависит от вашего варианта использования.

+0

U не совсем правы, AsyncTask использует threadPoolExecutor для запуска операций и простого LinkedBlockingQueue для хранения задачи с абсолютным минимумом в 2 потока и максимум вдвое больше числа процессоров (2 * C + 1), потоки называются «AsyncTask #» и не будут убиты после завершения AsyncTask, вместо этого они будут ждать следующей задачи. https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L208 – Inverce

+0

Спасибо за информацию. По вашей ссылке есть строка: private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; , 'AsyncTask' * может * использовать threadPoolExecutor, но поведение по умолчанию является серийным. –

+0

@Inverce 'Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать ошибок обычного приложения, вызванных параллельным выполнением. 'Ссылка [здесь] (https://developer.android.com/reference/android/os/AsyncTask.html). – Enzokie

0

@Override protected void onPreExecute() { holdWait = false; stop = false; }

@Override 
    protected Void doInBackground(Void... params) { 
     synchronized (this) { 
      while(true) { 
       if(Work) return null; 
       if(HaveWork) { 
        //make some 
       } else { 
        try { 
         wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 
     return null; 
    } 

    public void mynotify() { 
     synchronized (this) { 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 

    public void setStopWork() { 
     synchronized (this) { 
      stop= false; 
      if(holdWait) { 
       notify(); 
       holdWait = false; 
      } 
     } 
    } 
} 
+0

Я думаю, вы не поняли мой вопрос. Я не буду ссылаться на асинтез и снова запускать его и агарировать. Я просто запускаю asyctask для извлечения данных из базы данных только один раз, когда запускается мое приложение. –

+0

@DayemSiddiqui у меня был обновленный код, пожалуйста, проверьте – user1782565

+0

@DayemSiddiqui может это поможет вам – user1782565

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