Android — httpclient как фоновый сервис

#android #service #httpclient

#Android #Обслуживание #httpclient

Вопрос:

у меня есть приложение, которое выполняет вход в веб-сервис, а также загружает файл. Мне нужно поддерживать сеанс, когда я захожу на разные экраны и получаю данные из webservice. Я прочитал, что мне нужно выполнять http-вызовы как сервис и, возможно, загружать мое приложение с помощью сервиса. Как мне поместить мои действия «login» и вызовы httpclient действия «upload» в действие службы http?

Спасибо.

Ответ №1:

Поскольку служба выполняется в том же потоке, что и поток пользовательского интерфейса, вам нужно будет запустить службу в другом потоке. Вы можете сделать это несколькими различными способами:

  1. Используйте обычную потоковую обработку Java в рамках методов службы onCreate () или onBind() etc
  2. Используйте AsyncTask в onCreate() методе — еще одна форма потоковой обработки, но намного более чистая, если вам нужно выполнять обновления пользовательского интерфейса
  3. Используйте 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, было бы много значения, если бы был опубликован пример / фрагмент.