AsyncTask 内部的改造调用

2022-09-05 00:21:36

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

i. 我已经实现了对我的 api 的异步调用,该调用在 AsyncTask 的 doInBackground 方法中调用。担忧:阅读这篇文章让我感到困惑。异步任务不适合这种任务吗?我应该直接从活动调用 API 吗?我知道Retrofit的回调方法是在UI线程上执行的,但是通过HTTP进行调用呢?改造是否为此创建了螺纹?

ii. 我希望将身份验证响应保存在共享首选项对象中,该对象在回调的成功方法中似乎不可用。任何建议/良好做法?

提前感谢您:)

这是我的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

I. 改造支持三种提出请求的方式:

  • 同步

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

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

此方法在调用的线程中完成。因此,您无法在主/UI线程中调用它

  • 异步

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

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

请求的执行在新的后台线程中调用,回调方法在调用哪个方法的线程中完成,因此您可以在没有新线程/AsyncTask 的情况下在 main/UI 线程中调用此方法。

  • 使用RxAndroid

我知道的最后一种方法是使用RxAndroid的方法。您必须声明将响应返回为具有值的可观察性的方法。例如:

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

此方法还支持在新线程中发出网络请求。因此,您不必创建新的线程/异步任务。来自订阅方法的 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();

答案 2

推荐