Thread.sleep останавливает все вложенные Asyntasks

Я следую tutes из codelearn и пытаюсь создать AsyncTask, который генерирует твиты и выполняет другую AsyncTask для записи в файл кеша. У меня есть Thread.sleep, поэтому пользовательский интерфейс при первом загрузке ожидает, пока твиты будут записаны в файл кеша. Сначала я запускаю AysncTask new AsyncWriteTweets(this.parent).execute(tweets); Затем спать в течение 10 секунд.

Но в logcat я вижу, что AsyncWriteTweets также запускается после 10 секунд сна. Следовательно, onPostExecute выполняется до того, как твиты записываются в файл кэша, давая пустой экран.

 public class AsyncFetchTweets extends AsyncTask<Void, Void, Void> { private TweetListActivity parent; ArrayList<Tweet> tweets = new ArrayList<Tweet>(); ArrayList[] temp; public AsyncFetchTweets(TweetListActivity parent){ this.parent = parent; } @Override protected Void doInBackground(Void... params) { int result = 0; Log.d("ASync", "Calling asycn"); for (int i=0;i<4;i++){ Tweet tweet = new Tweet(); tweet.setTitle("Title Async Very New" + i); tweet.setBody("Body text for tweet no " + i); tweets.add(tweet); } new AsyncWriteTweets(this.parent).execute(tweets); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } return null; } protected void onPostExecute(Void result){ Log.d("Async", "on Post execute"); this.parent.renderTweets(); } } 

PS: Мое предположение: AsyncTask должен создать новый поток, поэтому Thread.sleep в родительском объекте не должен останавливать дочерние элементы. Если это так, пожалуйста, сообщите, как я могу решить эту проблему.

Эта:

 new AsyncWriteTweets(this.parent).execute(tweets); 

Неверно, AsyncTask должен выполняться в потоке пользовательского интерфейса, а не в потоке Worker. Вы можете использовать Handler и post runnable для безопасного выполнения.

Для справки смотрите в правила Threading:

Execute (Params …) должен быть вызван в потоке пользовательского интерфейса.

http://developer.android.com/reference/android/os/AsyncTask.html

Другая часть вышеуказанной ссылки представляет собой Order of execution :

Начиная с HONEYCOMB, задачи выполняются в одном потоке, чтобы избежать общих ошибок приложений, вызванных параллельным выполнением.

Поэтому ваша первая асинтеза должна заканчиваться до следующего запуска, но вы можете вернуть предыдущее параллельное поведение с помощью executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR. Все равно execute должно выполняться в потоке пользовательского интерфейса.

В соответствии с документацией по методу execute () для всех асинхронных задач используется один поток. Итак, если вы спите в своих задачах async, это повлияет на другие задачи async.

Попробуйте выполнить executeOnExecutor .