Концептуально ваш HTTPAsyncTask
doInBackground()
состоит из 2 различных действий:
- Подключите и поставьте в очередь запрос к сокету
- Получите ответ
(после чего, конечно, будет вызываться onPostExecute()
.)
Как вы уже описали, вам нужно контролировать порядок выполнения для действия # 1 в двух разных потоках, одновременно позволяя параллельное действие № 2.
Это невозможно при использовании механизма generi c AsyncTask
, поскольку вы не предоставили никакого способа «разбить задачу на две части»; поток A не может выяснить, когда поток B переключился с действия № 1 на действие № 2 или наоборот.
Возможно, такие логики c могут быть добавлены, но вы не объяснили как вы выполняете вызов сокета.
Однако нет смысла предоставлять эту дополнительную информацию; крайние случаи, связанные с сетевыми запросами, разрушают любую гарантию порядка, который у вас мог быть. Сети с потерями; запросы могут потерпеть неудачу, ответы могут потерпеть неудачу. Запросы могут поступать не в порядке, даже если они были отправлены по порядку (особенно если вы используете два отдельных сокета). Автоматические c повторные попытки могут занять несколько секунд для выполнения sh.
IOW, «нажатый» запрос может быть потерян сетью, и вам, возможно, придется когда-нибудь переместить его в сокет после того, как «неотжатый» запрос завершен.
Я бы посоветовал вам отказаться от «частичного условного параллелизма», к которому вы стремитесь, и просто убедиться, что первый HTTPAsyncTask
завершен, прежде чем выполнить второй. .
В качестве альтернативы, вы можете добавить последовательный «идентификатор запроса» к каждому POST или включить информацию о первом запросе в во втором запросе, чтобы сервер мог разобрать, что произошло, даже если запросы поступили не в порядке.