#android #service #httpclient
#Android #Обслуживание #httpclient
Вопрос:
у меня есть приложение, которое выполняет вход в веб-сервис, а также загружает файл. Мне нужно поддерживать сеанс, когда я захожу на разные экраны и получаю данные из webservice. Я прочитал, что мне нужно выполнять http-вызовы как сервис и, возможно, загружать мое приложение с помощью сервиса. Как мне поместить мои действия «login» и вызовы httpclient действия «upload» в действие службы http?
Спасибо.
Ответ №1:
Поскольку служба выполняется в том же потоке, что и поток пользовательского интерфейса, вам нужно будет запустить службу в другом потоке. Вы можете сделать это несколькими различными способами:
- Используйте обычную потоковую обработку Java в рамках методов службы
onCreate ()
илиonBind()
etc - Используйте AsyncTask в
onCreate()
методе — еще одна форма потоковой обработки, но намного более чистая, если вам нужно выполнять обновления пользовательского интерфейса - Используйте
IntentService
, который обеспечивает выполнение асинхронной служебной задачи — не уверен, насколько хорошо это работает, поскольку я никогда им не пользовался.
Все три из этих методов должны позволить вам устанавливать соединения с HttpClient в фоновом режиме и через сервис, и хотя я никогда не использовал IntentService, для меня это выглядит как лучший вариант. AsyncTask был бы очень полезен, если вам нужно внести изменения в пользовательский интерфейс, которые могут быть выполнены только в потоке пользовательского интерфейса.
Редактировать по запросу: Итак, в настоящее время я делаю что-то, для чего требуются Http-соединения асинхронным способом. После написания этого поста я попытался выполнить номер 3, и это работает очень хорошо / легко. Единственная проблема заключается в том, что информация должна передаваться между двумя контекстами через intents, что действительно уродливо. Итак, вот приблизительный пример того, что вы можете сделать, чтобы устанавливать http-соединения в асинхронной фоновой службе.
Запустите асинхронный сервис из внешнего действия. Я поместил две кнопки просто так, чтобы можно было видеть выполнение действия во время работы сервиса. Намерение может быть запущено действительно где угодно, по вашему желанию.
/* Can be executed when button is clicked, activity is launched, etc.
Here I launch it from a OnClickListener of a button. Not really relevant to our interests. */
public void onClick(View v) {
Intent i = new Intent ("com.test.services.BackgroundConnectionService");
v.getContext().startService(i);
}
Затем внутри BackgroundConnectionService
вам нужно расширить класс IntentService и реализовать все http-вызовы в onHandleIntent(Intent intent)
методе. Это так же просто, как в этом примере:
public class BackgroundConnectionService extends IntentService {
public BackgroundConnectionService() {
// Need this to name the service
super ("ConnectionServices");
}
@Override
protected void onHandleIntent(Intent arg0) {
// Do stuff that you want to happen asynchronously here
DefaultHttpClient httpclient = new DefaultHttpClient ();
HttpGet httpget = new HttpGet ("http://www.google.com");
// Some try and catch that I am leaving out
httpclient.execute (httpget);
}
}
Наконец, объявите асинхронный сервис, как любой обычный сервис в AndroidManifest.xml файл внутри <application>
тегов.
...
<service android:name="com.test.services.BackgroundConnectionService">
<intent-filter>
<action android:name="com.test.services.BackgroundConnectionService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
...
Это должно примерно сработать. На самом деле это довольно просто: D
Комментарии:
1. Спасибо за подсказку. Поскольку я новичок в Java, было бы много значения, если бы был опубликован пример / фрагмент.