【问题标题】:How to return String from onResponse? Retrofit android studio如何从 onResponse 返回字符串?改造安卓工作室
【发布时间】:2020-10-11 18:24:18
【问题描述】:

我看到了一些类似的问题,但它们似乎并没有准确地回答我的问题。我有一个应该返回字符串的方法。我正在使用改造,但在响应中,我无法返回字符串?下面是代码。

public String getInformation(String information, String username) {

       

        String result;
        Call<DefaultResponse> call = RetrofitClient.getInstance().getApi().getInformation(information,username);

        call.enqueue(new Callback<DefaultResponse>() {
            @Override
            public void onResponse(Call<DefaultResponse> call, Response<DefaultResponse> response) {
                 result = response.body().getMsg();
            }

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

            }

        });
        
        return result;



    }

【问题讨论】:

  • “我有一个应该返回字符串的方法”——如果该方法将在后台线程上调用,请尝试使用call.execute() 而不是call.enqueue()。如果将在主应用程序线程上调用该方法,则不应将其设置为返回字符串,因为在主应用程序线程上进行网络 I/O 是个坏主意。
  • 谢谢,我试过 call.execute() 并抛出错误 android.os.NetworkOnMainThreadException
  • 那是因为您的方法正在主应用程序线程上被调用。您需要调整此方法以不返回字符串。相反,让它接受某种可以从onResponse() 调用的回调。这样,enqueue() 将为您处理后台线程,因此您的网络 I/O 不会冻结 UI。见y.allam's answer

标签: android mysql get retrofit retrofit2


【解决方案1】:

.enqueue 方法需要一些时间才能获得响应,因此您的方法将在调用 onResponse 回调之前返回。

尝试对getInformation 方法使用回调方法并将其设为void

public void getInformation(String information, String username, MyCallback callback) {

        Call<DefaultResponse> call = RetrofitClient.getInstance().getApi().getInformation(information,username);

        call.enqueue(new Callback<DefaultResponse>() {
            @Override
            public void onResponse(Call<DefaultResponse> call, Response<DefaultResponse> response) {
                 result = response.body().getMsg();
                 callback.success(result);
            }

            @Override
            public void onFailure(Call<DefaultResponse> call, Throwable t) {
                 callback.failure(t)
            }

        });
}

使用MyCallback 接口:

interface MyCallback {
    void success(String result);
    void failure(Throwable t);
}

然后你可以这样调用方法:

getInformation("Information", "Username", new MyCallback() {
            @Override
            public void success(String result) {
                // Use result
            }

            @Override
            public void failure(Throwable t) {
                // Display error
            }

        });

【讨论】:

  • 谢谢。我如何从 getInformation 调用之外获取结果的值?
  • @AnonymousCardinal 这是答案的最后一部分,在success 回调中
  • 是的,但是如何从方法外部访问该变量?
  • 在调用方法的地方可以直接访问,调用和传递回调的地方是“方法外”!
  • 这里有点迷糊,我是初学者。调用 getInformation 后,如何获取 String 结果的值。除了将结果的值传递到 getInformation 之外,我不想做任何成功的事情。
【解决方案2】:

您可以在任何需要的地方使用 Result 作为输出字符串,就像我在 onBindViewHolder 方法的适配器类中使用它一样,只需创建发送字符串的类的对象,然后调用该方法(其中 Interface 被保留为参数) & 覆盖适配器类中的成功和失败方法,并对这个字符串做任何你想做的事情............非常感谢@y.allam & @Anonymous Cardinal :):)

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2017-02-09
    • 2018-01-29
    • 2013-07-08
    • 2017-04-17
    • 2014-04-30
    相关资源
    最近更新 更多