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.
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
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();
}
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
}
});
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