równoległe działanie asynchroniczne

Mam SplashActivity w mojej aplikacji, które robią pewne rzeczy za pomocą AsyncTask po uruchomieniu aplikacji.

Utworzyłem również inną AsyncTask, która pobiera dane z serwera. Teraz po zamknięciu mojej aplikacji AsyncTask nadal pobiera dane.

Ale po ponownym uruchomieniu aplikacji Moja AsyncTask SplashActivity nie wykonuje swojego tła (funkcja doInBackground), dopóki mój downloader AsyncTask nie zostanie ukończony, a moja aplikacja jest powieszony.

Więc moje pytanie jest to, że nie możemy uruchomić dwa AsyncTask równolegle? Oba AsyncTask są różne i robią swoje własne rzeczy. Jest na to sposób.

Author: Cameron MacFarland, 2012-12-17

3 answers

Będziesz musiał użyć thread pool Executor aby wykonać AsyncTask. Domyślna implementacja używa szeregowego executora działającego na pojedynczym wątku

Więc utwórz ThreadPoolExecutor , a następnie użyj

AsyncTask ' s executeOnExecutor zamiast tylko execute method

 32
Author: nandeesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 18:49:48

Nastąpiła zmiana w AsyncTask od wydania Honeycomb. Starsze wersje miały pulę wątków 10 wątków, więc można było uruchomić 10 zadań równolegle. Ale dla Honeycomb i up, domyślnym jest serial executor, który wykonuje zadania jeden po drugim. Ale możesz przekazać ThreadPoolExecutor do wykonania:

   if (Build.VERSION.SDK_INT >= 11) {
     //--post GB use serial executor by default --
     task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
   } else {
     //--GB uses ThreadPoolExecutor by default--
     task.execute();
   }
 37
Author: S.D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-31 05:56:29

Inną opcją jest użycie AsyncTaskCompat z biblioteki support V.4.

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() {
    @Override
    protected Object doInBackground(Void... params) {
        // do your parallel task here
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        // and fetch result
    }
});
 4
Author: Arsenius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-05 02:43:00