Ограничения потоков Android AsyncTask?

я разрабатываю приложение, в котором мне нужно обновлять некоторую информацию каждый раз, когда пользователь входит в систему, я также использую базу данных в телефоне. Для всех этих операции (обновления, извлечение данных из БД и т.д.) Я использую асинхронные задачи.До сих пор я не понимал, почему я не должен их использовать, но недавно я обнаружил, что если я выполняю некоторые операции, некоторые из моих асинхронных задач просто останавливаться при предварительном выполнении и не переходить к doInBackground. Было слишком странно оставлять все так, поэтому я разработал еще одно простое приложение, просто чтобы проверить, что не так. И достаточно странно, я получаю такое же поведение при подсчете общего количества асинхронных операций. задачи достигают 5, 6-я останавливается на предварительном выполнении.

Есть ли у Android ограничение на количество асинхронных задач в 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");
    }
}
95
задан Mindaugas Svirskas 11 March 2012 в 10:24
поделиться