提问者:小点点

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


因此,为了遵守职责分离原则,我尝试让我的修改方法(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个答案

匿名用户

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

更具体地说,要么:

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

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 = {...}
            );
    }
}