我有一个登录Web服务并上传文件的应用程序。 当我进入不同的屏幕并从webservice获取数据时,我需要保持会话处于活动状态。 我读过我需要将http调用作为服务,并且可能使用该服务启动我的应用程序。 如何将我的“登录”活动和“上传”活动httpclient调用放在http服务活动中?
感谢。
答案 0 :(得分:6)
由于服务在与UI线程相同的线程上运行,因此您需要在不同的线程中运行该服务。您可以通过几种不同的方式完成此任务:
onCreate ()
或onBind()
等方法中使用常规的java线程,方法onCreate()
方法中使用AsyncTask - 另一种形式的线程,但如果您需要进行UI更新则更清晰IntentService
- 不确定这是否有效,因为我从未使用过它。这三种方法都应该允许你在后台和服务中与HttpClient建立连接,即使我从未使用过IntentService,它看起来对我来说是最好的选择。如果您需要对UI进行更改,AsyncTask非常有用,只能在UI线程上完成。
按请求编辑:所以我目前正在做一些以异步方式需要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类并在onHandleIntent(Intent intent)
方法中实现所有http调用。它就像这个例子一样简单:
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);
}
}
最后,声明异步服务,就像在<application>
标记内的AndroidManifest.xml文件中的任何普通服务一样。
...
<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