java - 从内部类获取变量值

标签 java android retrofit

我有一个在其中实现类的方法:

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/

相关文章:

android - 为什么我不能使用模型类在数据库中设置特定子项的值?

android - 如何在 Android 中从 Sandbox 模式设置 Google Wallet Production 模式?

java - Android 通过 RN42 蓝牙模块与 Arduino 的通信不匹配

java.lang.IllegalStateException : Could not execute method of the activity while executing Retrofit GET method in Android studio

java - 如何修复从 LinkedTreeMap 到 ArrayList 的 Gson JSON 解析?

java - 删除菜单 Java Android

java - 如何判断java中空列表的内容类型

java - Java中如何保证用户输入始终为Integer

java - Observable.empty() 导致 java.util.NoSuchElementException : Sequence contains no elements

android - 在 Android 中使用 Retrofit 2.0