Android - httpclient в качестве фонового сервиса

1

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

Спасибо.

Теги:
httpclient
service

1 ответ

6
Лучший ответ

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

  • Использовать регулярные потоки java в службе onCreate () или onBind() и т.д., методы
  • Использовать AsyncTask в методе onCreate() - другая форма потоковой передачи, но гораздо более чистая, если вам нужно обновлять пользовательские интерфейсы.
  • Используйте IntentService, который обеспечивает выполнение асинхронной служебной задачи - не уверен, насколько хорошо это работает, поскольку я никогда не использовал его.

Все три из этих методов должны позволять вам устанавливать соединения с HttpClient в фоновом режиме и через Сервис, и хотя я никогда не использовал IntentService, это выглядит как лучший вариант для меня. AsyncTask был бы очень полезен, если вам нужно внести изменения в пользовательский интерфейс, который может быть выполнен только в потоке пользовательского интерфейса.

Отредактируйте по запросу: Итак, я делаю то, что требует Http-соединений асинхронным способом. После создания этого сообщения я попытался сделать номер 3, и он работает очень хорошо/легко. Единственная проблема заключается в том, что информация должна передаваться между двумя контекстами посредством намерений, которые действительно уродливы. Итак, вот приблизительный пример того, что вы можете сделать, чтобы сделать 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

  • 0
    Спасибо за подсказку. Поскольку я новичок в Java, это будет много значить, если пример / фрагмент был опубликован.
  • 0
    Сделал правку, подробно описывающую, как заставить это работать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню