Android - httpclient作为后台服务

时间:2011-04-15 21:40:30

标签: android service httpclient

我有一个登录Web服务并上传文件的应用程序。 当我进入不同的屏幕并从webservice获取数据时,我需要保持会话处于活动状态。 我读过我需要将http调用作为服务,并且可能使用该服务启动我的应用程序。 如何将我的“登录”活动和“上传”活动httpclient调用放在http服务活动中?

感谢。

1 个答案:

答案 0 :(得分:6)

由于服务在与UI线程相同的线程上运行,因此您需要在不同的线程中运行该服务。您可以通过几种不同的方式完成此任务:

  1. 在服务的onCreate ()onBind()等方法中使用常规的java线程,方法
  2. onCreate()方法中使用AsyncTask - 另一种形式的线程,但如果您需要进行UI更新则更清晰
  3. 使用提供异步服务任务执行的IntentService - 不确定这是否有效,因为我从未使用过它。
  4. 这三种方法都应该允许你在后台和服务中与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