【发布时间】: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