У меня есть приложение для входа в веб-сервис, а также загрузка файла. Мне нужно, чтобы сеанс был активным, когда я перехожу на разные экраны и получаю данные из webservice. Я читал, что мне нужно сделать http-вызовы как услугу и, возможно, загрузить мое приложение с сервисом. Как я могу поместить свою активность "входа" и "загрузить" активность вызовов httpclient внутри активности службы http?
Спасибо.
Поскольку служба работает в том же потоке, что и поток пользовательского интерфейса, вам нужно будет запустить службу в другом потоке. Вы можете сделать это несколькими способами:
onCreate ()
или onBind()
и т.д., методы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