因此,为了遵守职责分离原则,我尝试让我的修改方法(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等,如何解决这个问题呢?
问题是您试图用异步代码实现同步行为。有人可能会说,你最好选择一种方法,并始终如一地使用它。
更具体地说,要么:
不使用带有回调的改型,而是同步执行网络调用,这样您就可以立即处理响应:
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 = {...}
);
}
}