我有一个在其中实现类的方法:
public class RetrofitCallBackUtil {
private ArrayList<Message> messages = new ArrayList<>();
public ArrayList<Message> getLastTenMessageCallBack(int user_id, int sender_id, int offset_number, RESTDatabaseDAO service) {
Call<ArrayList<Message>> call = service.getLastTenMessage(user_id, sender_id, offset_number);
call.enqueue(new Callback<ArrayList<Message>>() {
@Override
public void onResponse(Call<ArrayList<Message>> call, Response<ArrayList<Message>> response) {
if (response.isSuccess()) {
messages = response.body();
Log.i("Success", "Good ten " + response.body().size());
} else {
Log.i("Success", "Not good ten" + response.raw());
}
}
@Override
public void onFailure(Call<ArrayList<Message>> call, Throwable t) {
Log.i("Fail", "Failure ten " + t.toString());
}
});
//Still get NullPointException from here. (messages.size())
Log.i("Success", "Good ten activity" + messages.size());
return messages;
}
}
我想获取消息变量的值但不能。我还创建了一个全局变量 List<Message> messages
并返回但仍然无法从 response.body()
获取值(value).有人对此有解决方案吗?
更新:
我想要这样的东西:
List<Message> testMessages = retrofitCallBackUtil.getLastTenMessageCallBack(AppConfig.USER_ID, userId, 0, service);
因为我想在很多地方多次使用该方法的结果,所以我希望它返回一个数据给我。
最佳答案
首先,你的方法
public ArrayList<Message> getLastTenMessageCallBack(...)
具有同步签名,但实现是异步的。所以当方法返回 messages
时, 它们仍然是空的。
带有异步实现的正确签名是
public void getLastTenMessageCallBack(...)
只有在回调中才能获取结果。
如果你想要一个同步方法,你可以使用闩锁:
public ArrayList<Message> getLastTenMessageCallBack(int user_id, int sender_id, int offset_number, RESTDatabaseDAO service) {
ArrayList<Message> messages = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(1);
Call<ArrayList<Message>> call = service.getLastTenMessage(user_id, sender_id, offset_number);
call.enqueue(new Callback<ArrayList<Message>>() {
@Override
public void onResponse(Call<ArrayList<Message>> call, Response<ArrayList<Message>> response) {
if (response.isSuccess()) {
messages = response.body();
latch.countDown();
}
}
@Override
public void onFailure(Call<ArrayList<Message>> call, Throwable t) {
Log.i("Fail", "Failure ten " + t.toString());
latch.countDown();
}
});
//waiting result ...
latch.await();
return messages;
}
请注意,没有超出方法范围的变量。
更新
如果您想要异步方法并希望从多个类中使用它怎么办。正确的签名是:
public void getLastTenMessageCallBack(..., Callback<ArrayList<Message>>)
您将在客户端代码中实现此回调。异步方法当然更可取,这样可以避免 ui 阻塞
关于java - 从内部类获取变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933850/