2

在我们的 Android 应用程序中,我们使用第三方供应商提供聊天服务。我们需要为用户创建会话,然后登录以使用该服务,然后必须获取消息。所有这些都是单独的 HTTP 请求,需要在一个成功回调中调用。那么我该怎么做呢,如下所示。

   ExternalService.createSession(param1, param2, new Callback<Session>() {

        void onSuccess(Session session) {
             session.login(new Callback<User> {


             void onSuccess(User user) {

                 user.getMessages(new Callback<List<Messages>> {

                      void onSuccess(List<Messages> messages) {
                         // This is original place where everything is success
                      }

                      void onError(Error error) {


                      }

                 } 
             }

             void onError(Error error) {


             }
        }

        void onError(Error error) {

        }

   });

如果我在 中运行Activity,它工作正常没有问题。如何做到这一点Service?因为在Service我也有问题运行AsyncTask,抛出错误"Can't create handler inside thread that has not called Looper.prepare()"。在调用并到达块结束Service后退出。(我明白,这就是行为)。但是我怎么能不使用来实现呢?或者如果没有使用没有其他方法可以做,我怎么能在完成我需要的事情后停止它?这样做的最佳方法是什么?AsyncTaskhandleActionServiceLooperLooper

4

2 回答 2

0

您可以使用IntentService来执行这样的后台操作。

它基本上在专用后台线程中按顺序执行传递给它的工作请求。

在该onHandleIntent()方法中,您可以按顺序定义 API 调用序列,甚至不需要回调,从而使代码更具可读性(当然,如果您的库支持阻塞调用)。

就像是:

//This is just pseudocode to give an idea of how this would work @Override protected void onHandleIntent(Intent workIntent) { Session session = createSession(); User user = session.login(); List<Messages> messages = user.getMessages(); }

您可以这样做,因为该onHandleIntent()方法中发生的所有事情都发生在后台线程中,因此这些操作不会阻塞 UI。

您可以查看官方IntentService 教程以了解示例用法。

需要注意的一点是,您不能直接通过此服务操作 UI。要与 Activity 进行通信,可以使用LocalBroadcastManager.sendBroadcast()方法。教程中也对此进行了说明。

于 2015-08-07T14:09:33.307 回答
0

假设没有 UI 交互(因为您正在从服务运行代码),只需将 a 转换AsyncTask为 aRunnable并将 a 包裹Thread起来:

new Thread(new Runnable {

  @Override
  void run() {
      // whatever happens in AsyncTask.doInBackground goes in here
  }

}).start();
于 2015-08-07T13:43:28.517 回答