Android - httpclient в качестве фонового сервиса - PullRequest
1 голос
/ 16 апреля 2011

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

Спасибо.

1 Ответ

6 голосов
/ 16 апреля 2011

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

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

...