从方法中的内部类返回值

时间:2016-02-08 16:42:55

标签: java android json http callback

我正在为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方法中的状态。

4 个答案:

答案 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调用运行后台服务。