当前位置: 首页 > 知识库问答 >
问题:

在另一个类中使用改型响应

夏奕
2023-03-14

因此,为了遵守职责分离原则,我尝试让我的修改方法(listNearestAirports)将列表返回给演示者(在不同的包中)。但我注意到,这在改型时很难做到,从必须在我的方法范围之外声明列表,到我只能在onResponse方法内迭代列表(当我试图返回列表时,我得到一个空指针异常)。请参阅下面的代码

public class NearestAirports {

     List<GeoSearchResult> airportsList;

        public List<GeoSearchResult> listNearestAirports(String lat, String lng) {
            String reuquestBody = "{Escaped_JSON_request}";
            AirportApi.Factory.getInstance().getAirports(requestBody).enqueue(new Callback<AirportCodes>() {

                public void onResponse(Call<AirportCodes> call, Response<AirportCodes> response) {
                    airportsList = response.body().getGeoSearchRS().getGeoSearchResults().getGeoSearchResult();
                    //Here the list is populated successfully every time and I can iterate through it
                    System.out.println(airportsList.iterator().next().getCity());
                }

                public void onFailure(Call<AirportCodes> call, Throwable t) {
                    System.out.println("failed");
                    if (t instanceof IOException) {
                        System.out.println("actual network failure");

                    }
                    else {
                        System.out.println("conversion issue);
                    }
                }
            });
//Should return list, but at this point the list is null
            return airportsList;
        }
}

我想要向main()返回一个列表,因此可以执行以下操作:

        NearestAirports nearest = new NearestAirports();
        airportsList = nearest.listNearestAirports(lat, lng);
        System.out.println(airportsList.iterator().next().getCity());

        for (GeoSearchResult airport : airportsList) {
            System.out.print(airport.getId() + ", ");
            System.out.println(airport.getName());
        } 

什么是最简单的方法来返回来自改装的响应?我需要用灭菌法吗?或者什么是最好的方法来区分从修改获得响应和处理并呈现响应?

=============================*UPDATE*=============================================

这个问题似乎与访问内部类有关我试图在内部类之外声明一个变量,希望我能将从改版得到的响应赋给该变量。这失败的原因是:1。我得到一个错误消息:从内部类访问的变量必须声明为final。很好,所以2。我声明它是final,但随后我得到另一条错误消息:这个变量不能被赋值,因为它声明为final。这里讨论了一个技巧,但对我的特定情况不起作用:对内部类的局部变量访问需要声明为final

我发现尝试将逻辑和修改响应从活动中分离出来是很困难的,因为最终我想要在activity/片段中显示响应,而这严重依赖于视图对象,在UI线程中执行操作等。

对于一个简单的应用程序,如果不借助Rx、Java和Android的数据绑定ViewModel等,如何解决这个问题呢?

共有1个答案

岳泉
2023-03-14

问题是您试图用异步代码实现同步行为。有人可能会说,你最好选择一种方法,并始终如一地使用它。

更具体地说,要么:

不使用带有回调的改型,而是同步执行网络调用,这样您就可以立即处理响应:

public class AirportApi {
    public Call<AirportCodes> getAirports(@Body...);
}

public class NearestAirports {
    public List<GeoSearchResult> listNearestAirports(String lat, String lng) {
        final Response<AirportCodes> airportCodes = AirportApi.Factory.getInstance()
            .getAirports(requestBody)
            .execute();

        // interrogate response and transform AirportCodes into List<GeoSearchResult>
        // don't forget to account for failures
}

(举个例子...)更改API以返回RxJavasingle。然后从需要数据的地方调用API,并订阅调用调用的结果。

public class AirportApi {
    public Single<AirportCodes> getAirports(@Body...);
}

public class AirportDisplayActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        AirportApi.Factory.getInstance()
            .getAirports(requestBody)
            .subscribe(
                onSuccess = {...},
                onError = {...}
            );
    }
}
 类似资料:
  • 你好,我正在做一个应用程序,我需要显示最近10个视频从youtube频道。我用的是改装 首先,我使用以下内容: 从这个json中,我将获得频道ID,这样我就可以在这里使用它,从特定的youtube频道获取最后10个视频: 我已经完成了第一部分,并且使用了改版获得了频道ID。 在拳头onResponse改型调用中使用另一个改型调用可以吗?那就是在一个后台线程中有一个后台线程,或者有没有其他的方法可以

  • 问题内容: 当仅使用css将鼠标悬停在另一个类的元素上时,是否可以修改一个类的css? 就像是: 只有“包装器”不在“项目”内部,而是在其他地方。 我真的不想在简单的事情上使用javascript,但是如果必须的话,我该怎么做?这是我失败的尝试: 每个班级只有一个要素。不知道为什么他们在制作模板时不使用ID,但这就是事实,我无法更改。 [编辑] 这是一个菜单。每个菜单元素都有一个不同的类。当您将鼠

  • 我刚开始使用Java,到处搜索,但无论出于何种原因都无法找到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,该文件夹是我的包,为了说明: 我需要在第2类中创建第1类的实例,但它就是不起作用。这是一个示例: 文件路径: 文件路径: 我得到这个错误 根据要求,完整的源代码:注:class1=ClientIndividual,class2=涉众 第一个文件 第二个文件 第三个文件(接口

  • 我真的希望有人能帮我弄清楚我到底错过了什么。我已经将我的安装从PHP5.6升级到7.0,这迫使我从Mysql更新到Mysqli。由于某种原因,我的安装被破坏了。 我研究并遵循了“在其他类使用MySQLi”指南:在其他类使用MySQLi 我写作为最后的手段,也看了其他网站,但似乎问题来自其他地方。 首先,我有一个数据库类: 然后我有一个API类,我想在其中访问这个连接,它看起来像 最后我试着从一个函

  • 我刚开始Java,到处搜索,但无论出于什么原因都找不到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,那个文件夹是我的包,所以举例来说: 我需要在类2中创建一个类1的实例,但它就是不起作用。以下是一个示例: 文件路径: 文件路径:

  • 我一直在使用响应模板来提供动态响应,因为所有请求和查询参数都与该请求本身相关联。但是,我想使用多个参数发出 POST 请求,然后通过使用响应模板在存根 GET 方法的正文响应中使用这些参数。这在电线中可以做些什么吗?任何输入都非常感谢,谢谢!