(Android) Потоковая задача HttpClient, без блокировки пользовательского интерфейса?

#android #multithreading #httpclient #android-asynctask #fetch

#Android #многопоточность #httpclient #android-asynctask #извлечение

Вопрос:

Я создал приложение, которое извлекает веб-страницу из Интернета на основе пользовательского ввода, и это сработало. Выборка выполняется в несколько этапов: post со строкой из edittext в качестве параметра, после некоторого синтаксического анализа это возвращает массив имен, которые отображаются в AlertDialog. Когда пользователь выбирает одну, он создает другую запись с этой строкой в качестве параметра.
Это работает, но теперь я хочу сделать ее многопоточной (или аналогичной), чтобы пользовательский интерфейс не переставал отвечать. Я пробовал потоки, Runnables и AsyncTask, но я просто не могу найти конструкцию, позволяющую выполнять выборку в одном потоке, а также иметь возможность возвращать этот массив и выбирать имя, НЕ создавая новый экземпляр моего HttpClient. Это приведет к удалению файлов cookie, которые вы видите…

Я потратил около целой недели, чтобы разобраться в этом, но просто не вижу этого : (

Итак, у кого-нибудь есть идея? Спасибо!

Ответ №1:

Для каждого из ваших HTTP-обращений вы можете создать отдельный подкласс AsyncTask, затем создать экземпляр каждого из них по очереди и выполнить их. В Интернете есть много примеров того, как использовать AsyncTask для доступа к HTTP, например, здесь или here (просто погуглите что-нибудь вроде этого).

Основная идея, которую нужно понять, заключается в том, чтобы выполнять все операции, связанные с сетью, внутри doInBackground тела метода AsyncTask.

Как сказал Тед Хопп, вы можете позволить экземпляру HttpClient быть закрытым членом вашего Activity (или любого другого класса, содержащего две асинхронные задачи), чтобы первая асинхронная задача создавала его, а вторая могла просто использовать то же самое.

Ответ №2:

Вы можете использовать два подкласса AsyncTask, по одному для каждого запроса. Предоставьте подклассам доступ к переменной в вашем классе activity, в которой хранится объект HttpClient.

Комментарии:

1. Два подкласса? вы имеете в виду два экземпляра?

2. Я имею в виду экземпляры двух разных подклассов. В одном подклассе doInBackground извлекает массив имен. Как только имя выбрано, создайте экземпляр другого подкласса (передав выбранное имя в его конструкторе), который doInBackground выполняет вторую публикацию.