在AsyncTask内部进行改造调用

时间:2015-03-28 21:58:23

标签: java android android-asynctask retrofit

我最近开始开发Android应用并决定使用Retrofit作为REST服务的客户端,但我不确定我的方法是否合适:

我。我已经实现了对我的api的异步调用,它在AsyncTask的doInBackground方法中调用。 关注:阅读this article让我感到困惑。 AsyncTasks不适合这类任务吗?我应该直接从Activity调用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;
    }

1 个答案:

答案 0 :(得分:34)

予。 Retrofit支持三种发出请求的方式:

  • synchronic

您必须声明将响应返回为值的方法,例如:

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

此方法在调用的线程中完成。所以你无法在主/用户界面中调用它。

  • 异步

你必须声明void方法,其中包含带有响应的回调作为最后一个参数,例如:

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

在新的后台线程中调用请求的执行,并且在调用方法的线程中完成回调方法。所以你可以在没有新线程/ AsyncTask的主/ UI线程中调用这个方法。

  • 使用RxAndroid

我知道的最后一种方法是使用RxAndroid的方法。你必须声明一个方法,它将响应返回为带有值的observable。例如:

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

此方法还支持在新线程中发出网络请求。所以你不必创建新的线程/ AsyncTask。在UI /主线程中调用来自subscribe方法的Action1回调。

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();