【发布时间】:2020-01-31 13:08:28
【问题描述】:
我正在做一个基本的 android 应用程序,它执行一个简单的登录againts API。我需要返回接收到的数据,但改造 onResponse 方法的返回类型为 void。我的代码是:
package com.example.deberesloginjava.data;
import android.util.Log;
import com.example.deberesloginjava.data.APIServices.Post;
import com.example.deberesloginjava.data.model.LoggedInUser;
import java.io.IOException;
import com.example.deberesloginjava.data.APIServices.APIService;
import com.example.deberesloginjava.data.APIServices.ApiUtils;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import static android.content.ContentValues.TAG;
/**
* Class that handles authentication w/ login credentials and retrieves user information.
*/
public class LoginDataSource {
private APIService mAPIService;
public void getData(Callback<Result<LoggedInUser>> callback){
apiClient.getData().enqueue(callback);
}
public Result<LoggedInUser> login(String username, String password) {
try {
mAPIService = ApiUtils.getAPIService();
mAPIService.login(username, password, "password").enqueue(new Callback<Post>() {
@Override
public void onResponse(Call<Post> call, Response<Post> response) {
if(response.isSuccessful()) {
LoggedInUser loggedInUser;
loggedInUser = new LoggedInUser(response.body().getUserName(),response.body().getUserName(), response.body().getAccess_token());
return new Result.Success<>(loggedInUser);
}
}
@Override
public void onFailure(Call<Post> call, Throwable t) {
Log.e(TAG, "Unable to submit post to API.");
}
});
} catch (Exception e) {
return new Result.Error(new IOException("Error logging in", e));
}
}
}
我发现至少有两个这样的问题,并且都有几乎相同的回调解决方案,但我无法在我的情况下复制它。
提前致谢。
【问题讨论】:
-
你想实际返回什么?否则,您是否希望通过 Toast 成功登录尝试导航到另一个视图?
-
推荐使用改造的方法是将您的响应建模到数据类中
-
在 java 中无法以异步方式执行此操作。如果你想要一个除 void 以外的返回类型而不阻塞 ui 线程,你应该看看 kotlin 挂起函数。
-
@Blu 我想返回一个带有经过身份验证的用户数据的 Result
以用 Toast 显示它。我使用的基础是默认的 Android Studio 登录模板。 -
@titanlux619 检查我的答案
标签: android retrofit retrofit2