如何从retrofit onResponse返回值?

时间:2017-12-30 13:47:42

标签: android

我是Android的初学者,编写了一个简单的改造示例:

    LOGININTERFACE mAPISERVICE;
    mAPISERVICE= LOGINGENERATOR.getAPIServices();
    mAPISERVICE.savePost("0016642902","0016642902","password").enqueue(new Callback<LGOINMODEL>() {
        @Override
        public void onResponse(Call<LGOINMODEL> call, Response<LGOINMODEL> response) {
            LGOINMODEL output=response.body();
                            if(response.isSuccessful())
                test[0] ="behzad behzad behzad";
        }

        @Override
        public void onFailure(Call<LGOINMODEL> call, Throwable t) {

        }
    });

但是在这一行:

     test[0] ="behzad behzad behzad";

它无法返回值,并且没有阅读Stack Overflow上的任何教程,示例或其他帖子,因此仍然无法解决此问题。

2 个答案:

答案 0 :(得分:1)

你需要一个回调,所以每当你调用这个函数从服务器获取值时你都可以传递回调,当结果出现时它可以回复你。

回调界面

<强> MyResultsListener 的.java

public interface MyResultsListener{

  public void onData(LGOINMODEL loginModel);
  public void onFailed();

}

现在假设您所做的调用是在某个函数中,然后将MyResultsListener引用作为参数传递以获取结果。

public void makeServerCall(MyResultsListener listener){

LOGININTERFACE mAPISERVICE;
    mAPISERVICE= LOGINGENERATOR.getAPIServices();
    mAPISERVICE.savePost("0016642902","0016642902","password").enqueue(new Callback<LGOINMODEL>() {
        @Override
        public void onResponse(Call<LGOINMODEL> call, Response<LGOINMODEL> response) {
            LGOINMODEL output=response.body();
                            if(response.isSuccessful())
                test[0] ="behzad behzad behzad";
                //for getting back data to calling class or function
                listener.onData(output);
        }

        @Override
        public void onFailure(Call<LGOINMODEL> call, Throwable t) {
                //for failure handling
                listener.onFailed();
        }
    });
}

答案 1 :(得分:0)

使用retrofit2可以进行同步调用:

mAPISERVICE = LOGINGENERATOR.getAPIServices();
Callback<LOGINMODEL> mLOGINMODEL = mAPISERVICE.savePost("0016642902","0016642902","password");
Response<LOGINMODEL> response = mLOGINMODEL.execute();
...

但是,同步请求会在Android 4.0或更高版本上触发应用程序崩溃。您会遇到NetworkOnMainThreadException错误。

更多信息here