web-dev-qa-db-ja.com

AsyncTask内のレトロフィット呼び出し

最近Androidアプリの開発を開始し、RetrofitをRESTサービスのクライアントとして使用することにしましたが、私のアプローチが適切かどうかはわかりません:

私。 AsyncTaskのdoInBackgroundメソッド内で呼び出されるAPIへの非同期呼び出しを実装しました。 懸念:読んだこと この記事 私は混乱しました。 AsyncTasksはこの種のタスクに適していませんか?アクティビティから直接APIを呼び出す必要がありますか? RetrofitのコールバックメソッドがUIスレッドで実行されることは理解していますが、HTTPを介した呼び出しはどうですか? Retrofitはそのためのスレッドを作成しますか?

ii。 AuthenticationResponseをSharedPreferencesオブジェクト内に保存したいのですが、コールバックのsuccessメソッド内では使用できないようです。何か提案/グッドプラクティスはありますか?

前もって感謝します :)

これが私のdoInBackGroundMethodです:

    @Override
    protected String doInBackground(String... params) {
        Log.d(LOCATION_LOGIN_TASK_TAG, params[0]);

        LocationApi.getInstance().auth(new AuthenticationRequest(params[0]), new Callback<AuthenticationResponse>() {

            @Override
            public void success(AuthenticationResponse authenticationResponse, Response response) {
                Log.i("LOCATION_LOGIN_SUCCESS", "Successfully logged user into LocationAPI");
            }

            @Override
            public void failure(RetrofitError error) {
                Log.e("LOCATION_LOGIN_ERROR", "Error while authenticating user in the LocationAPI", error);
            }
        });
        return null;
    }
11
user3159152

I. Retrofitは、リクエストを行う3つの方法をサポートしています。

  • 同期

たとえば、応答を値として返すメソッドを宣言する必要があります。

  @GET("/your_endpoint")
  AuthenticationResponse auth(@Body AuthenticationRequest authRequest);

このメソッドは、が呼び出されるスレッドで実行されます。したがってメイン/ UIスレッドでは呼び出すことができません

  • 非同期

たとえば、最後のパラメータとして応答を含むコールバックを含むvoidメソッドを宣言する必要があります。

  @GET("/your_endpoint")
  void auth(@Body AuthenticationRequest authRequest, Callback<AuthenticationResponse> callback);

リクエストの実行は新しいバックグラウンドスレッドで呼び出され、コールバックメソッドは呼び出されたスレッドで実行されるため、新しいスレッド/ AsyncTaskなしでメイン/ UIスレッドでこのメソッドを呼び出すことができます。

  • RxAndroidの使用

私が知っている最後の方法は、RxAndroidを使用する方法です。応答を値で監視可能として返すメソッドを宣言する必要があります。例えば:

  @GET("/your_endpoint")
  Observable<AuthenticationResponse> auth(@Body AuthenticationRequest authRequest);

このメソッドは、新しいスレッドでのネットワーク要求の作成もサポートします。したがって、新しいスレッド/ AsyncTaskを作成する必要はありません。サブスクライブメソッドからのAction1コールバックは、UI /メインスレッドで呼び出されます。

II。以下に示すように、Activityでメソッドを呼び出すことができ、SharedPreferencesにデータを書き込むことができます。

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);
sharedPreferences.edit()
            .put...//put your data from AuthenticationResponse 
                   //object which is passed as params in callback method.
            .apply();
37