Я розробляю додаток, де мені потрібно оновлювати деяку інформацію кожного разу, коли користувач входить в систему, я також використовую базу даних у телефоні. Для всіх цих операцій (оновлення, отримання даних з db тощо) я використовую асинхронні завдання. Як і дотепер, я не розумів, чому я не повинен їх використовувати, але нещодавно я переконався, що якщо я роблю деякі операції, деякі мої асинхронні завдання просто зупиняються на попередньому виконанні і не переходять до doInBackground. Це було занадто дивно, щоб залишити це так, тому я розробив ще одне просте додаток, щоб просто перевірити, що не так. І як не дивно, я отримую однакову поведінку, коли кількість загальних асинхронних завдань досягає 5, а 6-е зупиняється на попередньому виконанні.
Чи має андроїд обмеження asyncTasks на Activity / App? Або це просто якась помилка, і про неї слід повідомити? Хтось стикався з тією ж проблемою і, можливо, знайшов її вирішення?
Ось код:
Просто створіть 5 із цих потоків для роботи у фоновому режимі:
private class LongAsync extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
isRunning = true;
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
while (isRunning)
{
}
return null;
}
@Override
protected void onPostExecute(String result)
{
Log.d("TestBug","onPostExecute");
}
}
А потім створіть цю нитку. Він увійде до preExecute і зависне (він не піде на doInBackground).
private class TestBug extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute()
{
Log.d("TestBug","onPreExecute");
waiting = new ProgressDialog(TestActivity.this);
waiting.setMessage("Loading data");
waiting.setIndeterminate(true);
waiting.setCancelable(true);
waiting.show();
}
@Override
protected String doInBackground(String... params)
{
Log.d("TestBug","doInBackground");
return null;
}
@Override
protected void onPostExecute(String result)
{
waiting.cancel();
Log.d("TestBug","onPostExecute");
}
}