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