我正在为Android应用构建登录系统。我正在使用OkHttp连接到我的服务器并获得JSON响应。
我已经使用登录返回数据定义了一个类(现在只是基于用户是否存在于数据库中的真/假响应),然后编写代码以连接到服务器,如下所示:
class UserLogin {
boolean status;
public void setStatus(boolean status) {
this.status = status;
}
public boolean getStatus() {
return status;
}
}
public class ClientServerInterface {
OkHttpClient client = new OkHttpClient();
boolean login(Request request) {
final Gson gson = new Gson();
client.newCall(request).enqueue(new Callback() {
UserLogin login;
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
login = gson.fromJson(response.body().charStream(), UserLogin.class);
login.setStatus(login.status);
}
});
// need to return the boolean response (status) here
}
}
将Request
变量传递给login
方法的代码完美无缺。我希望login
返回一个布尔响应,以便我可以将其传递给其他类中的其他方法。
但是,因为UserLogin
对象是在callback
中定义的,所以我无法在父方法中访问它。我已经制作了getStatus
方法但不确定如何正确使用它来获取主login
方法中的状态。
答案 0 :(得分:2)
你不能。将Request变量传递给login方法的代码有效 完美。我想登录返回一个布尔响应,以便我可以 将其传递给其他类中的其他方法。
enqueue
以异步方式执行代码。您不知道何时调用回调。您可以做的是将Callback作为参数添加到您的登录方法。 E.g。
boolean login(Request request, final Callback callback) {
并将其传递给enqueue
,
client.newCall(request).enqueue(callback);
或手动调用回调。 E.g。
@Override
public void onResponse(Call call, Response response) throws IOException {
if (callback != null) {
callback.onResponse(call, response);
}
}
在这两种情况下,登录的调用者都将收到所提供对象的回调,并根据收到的内容,决定采取行动
答案 1 :(得分:1)
您可以使用SynchronousQueue
:
final SynchronousQueue<Boolean> queue = new SynchronousQueue<>();
client.newCall(request).enqueue(new Callback() {
UserLogin login;
@Override
public void onFailure(Call call, IOException e) {
queue.put(false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
queue.put(true);
}
});
return queue.take();
答案 2 :(得分:1)
将loginStatus变量添加到类,如下所示,另外一个表示登录操作完成。
public class ClientServerInterface {
OkHttpClient client = new OkHttpClient();
private boolean loginStatus = false;
private boolean isLoginOperationDone = false;
boolean login(Request request) {
final Gson gson = new Gson();
client.newCall(request).enqueue(new Callback() {
UserLogin login;
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
login = gson.fromJson(response.body().charStream(), UserLogin.class);
loginStatus = login.setStatus(login.status);
isLoginOperationDone = true;
}
});
// need to return the boolean response (status) here
while( !isLoginOperationDone )
{
//not to do anything.
}
return loginStatus;
}
}
请注意,这可能有点笨拙但会解决您的问题。
答案 3 :(得分:0)
可行的方法是使用AsyncTask。重写doInBackground方法以执行http请求并通过覆盖onPostExecute方法获取结果。
在此处阅读更多内容:http://developer.android.com/reference/android/os/AsyncTask.html
更好的方法是为所有API调用运行后台服务。