【问题标题】:Passing a Retrofit2 response to an activity将 Retrofit2 响应传递给活动
【发布时间】:2018-11-25 21:12:46
【问题描述】:

这让我大吃一惊,这可能是你看到的第一件事。但是太长了,我试图理解为什么这不起作用。那么问题来了:

我使用 Retrofit 2 来获取对象“用户日志”。一切正常。 当我在日志中打印 Response.body() 时,对象对象似乎已被完美解析。

然后我将此对象设置为我的类“RepoUser_log”的一个字段,以便我在需要时获取我的对象。 当我想要它时,你会问吗? ... 很简单,我希望它在我的 mainActivity 中。

让我们来看看代码吧:

public class RepoUser_log {

    private static APIService userService = ApiUtils.getAPIService();
    public   Userslogs userslogs = new Userslogs();
    public  List<Userslogs> listUserslogs = new ArrayList<>();

    public RepoUser_log(int IdPersonne){
        userslogs = CallBy(IdPersonne);
    }
    public Userslogs  CallBy(int iduser){
    Call<Userslogs> call = userService.GetUser(iduser);
    call.enqueue(new Callback<Userslogs>() {

      @Override
    public void onResponse(Call<Userslogs> call, Response<Userslogs> response) {
   Userslogs   userslogs = (Userslogs) response.body();
   Log.d( "onResponse: " , response.body().getEmail()); // works well here !
   Log.d("usersLog : ", userslogs.getEmail());  // that too Works well !  So my object exists and is well parsed
 }

      @Override
  public void onFailure(Call<Userslogs> call, Throwable t) {
              Userslogs  userslogs = null;
           }
       });
        return userslogs;
    }
}

现在这是我的 MainActivity,当我想使用我刚得到的对象“userlogs”时

public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, NiveauFragment.OnMessageSendlistener{

    Userslogs userslogs;
    Joueur joueur;
    Personne personne;
    private View mProgressView;
    private static final String DATA_ID_PERSONNE = "idPersonne";
    int idPersonne;
    ServiceLocalisation serviceLocalisation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Intent intent = getIntent();
        idPersonne = intent.getIntExtra(DATA_ID_PERSONNE, idPersonne);

        RepoUser_log repoUser = new RepoUser_log(idPersonne);

        Log.d("doInBackground: ", repoUser.userslogs.getEmail()); // it fails here my object is null says the debugger

所以对我来说,我的 oop 理解似乎不是改造 2 的问题。 但是函数CallBy返回一个不能通过函数'void onResponse'的frontiere的userlog对象是一个新事物......

有人可以帮我吗...因为我还有很多其他东西要从改造中获得:) 我不想从活动本身加载。

谢谢。

【问题讨论】:

  • 你的实现不正确,当你调用call.enqueue时,它在另一个线程上工作,所以为什么方法CallBy返回空值
  • 谢谢Gianhtran!你说的好像很符合逻辑。 (我只是希望你不要这样说,因为你读过 ("doInbackground") (那是我今晚所做的everychanged 的​​剩余字符串;)......但是,是的,如果我使用 enque un 一个类,由主要活动调用...... .我的响应对象可能无法准时在mainActivity中进行log.d。这很有意义。我是多线程的新手...有没有可以用来等待mainActivity中的结果的函数?.. . 类似 C# 中的“等待”?
  • 请在下面查看我的答案:)
  • 我的解决方案是使用一个接口来监听您的 api 请求并在您的 api 成功或失败时向您的活动发布回调
  • 好吧,我想我明白了。我需要一个侦听器和一个函数来调用我的响应……然后我应该在主要使用两者。是的,应该这样做......看起来我很抱歉,但我很累。我需要在早上 5 点睡觉,我会在当天晚些时候继续与您交流,但我真的需要睡觉 :) 谢谢!我认为这就是解决方案。 :) 谢谢!

标签: android oop callback retrofit


【解决方案1】:

您正在onResponse 中创建新对象,使用那里的全局变量:

onResponse(Call<Userslogs> call, Response<Userslogs> response) {
   Userslogs   userslogs = (Userslogs) response.body();
   Log.d( "onResponse: " , response.body().getEmail()); // works well here !
   Log.d("usersLog : ", userslogs.getEmail());  // that too Works well !  So my object exists and is well parsed
 }

改变:

Userslogs userslogs = (Userslogs) response.body();

userslogs = = (Userslogs) response.body();

它应该工作。

【讨论】:

  • 你好尼勒什!好吧,不,它不起作用。我只是不知道如何在全球领域获得响应机构。 (对不起继续这句话:))。如果我 log.d '响应无效'函数内的结果,一切都是完美的。当我想将该主体放入同一类型的对象时,麻烦就开始了。并在此功能之外使用它。如果我在返回之前记录了 response.body 的包含...同样的事情...它变成了一个空对象。
  • 好的,所以我进步了一点:(我不知道为什么),但似乎测试 if(response.isSuccessfull) { functionToGetTheObject(response); 很重要} 然后你至少退出了 onResponse 函数。不,我需要将此字段放入我的 mainActivity ......这应该很容易......但它不是
【解决方案2】:

正如我上面评论的那样,您的实现是错误的, 所以我有一个解决方案

public class RepoUser_log {

    private static APIService userService = ApiUtils.getAPIService();
    public List<Userslogs> listUserslogs = new ArrayList<>();
    public ApiListenner listenner;
    private int IdPersonne;

    public RepoUser_log(int IdPersonne) {
        this.IdPersonne = IdPersonne;
    }

    public void setListenner(ApiListenner listenner) {
        this.listenner = listenner;
    }

    public void callApi() {
        CallBy(IdPersonne)
    }

    public Userslogs CallBy(int iduser) {
        Call<Userslogs> call = userService.GetUser(iduser);
        call.enqueue(new Callback<Userslogs>() {

            @Override
            public void onResponse(Call<Userslogs> call, Response<Userslogs> response) {
                if (listenner != null) listenner.onSuccess((Userslogs) response.body());
                Log.d("onResponse: ", response.body().getEmail()); // works well here !
                Log.d("usersLog : ",
                        userslogs.getEmail());  // that too Works well !  So my object exists and is well parsed
            }

            @Override
            public void onFailure(Call<Userslogs> call, Throwable t) {
                if (listenner != null) listenner.onFail(t);
            }
        });
        return userslogs;
    }

    public interface ApiListenner {
        void onSuccess(Userslogs userslogs);

        void onFail(Throwable t);
    }
}

在你的活动中

  @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Intent intent = getIntent();
        idPersonne = intent.getIntExtra(DATA_ID_PERSONNE, idPersonne);

        RepoUser_log repoUser = new RepoUser_log(idPersonne);

        repoUser.setListenner(new ApiListenner() {
            @Override
            public void onSuccess(Userslogs userslogs) {
                Log.d("doInBackground: ", userslogs.getEmail()); // it fails here my object is null says the debugger
            }

            @Override
            public void onFail(Throwable t) {
                // api fail
            }
        });
        repoUser.callApi(); 

    }

【讨论】:

  • 嗨,(我睡了个好觉回来了),我已经按原样实施了你的建议。它不工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
相关资源
最近更新 更多