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問題なく正常に動作します。でそれを行う方法はServiceService私も実行に問題があるため、AsyncTaskエラーをスローします"Can't create handler inside thread that has not called Looper.prepare()"Serviceを呼び出してブロックAsyncTaskの終わりに到達した後に終了します(私は理解しています、それが動作です)。しかし、使用せずにどうすれば達成できますか? または、 を使用せずに行う方法が他にない場合、必要なことを達成した後、どうすれば停止できますか? これを行うための最良のアプローチは何ですか?handleActionServiceLooperLooper

4

2 に答える 2

0

UI インタラクションがないと仮定すると (サービスからコードを実行しているため)、 を に変換AsyncTaskし、RunnableそれをラップするだけThreadです。

new Thread(new Runnable {

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

}).start();
于 2015-08-07T13:43:28.517 に答える
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 チュートリアルを参照してください。

注意すべきことの 1 つは、このサービスを介して UI を直接操作できないことです。アクティビティに返信するには、 LocalBroadcastManager.sendBroadcast()メソッドを使用できます。これはチュートリアルでも説明されています。

于 2015-08-07T14:09:33.307 に答える