Существует множество вещей, которые необходимо настроить для установки экземпляра Portal в среде исполнения, почти все из которых являются асинхронными вызовами загрузки. Заставить его работать не проблема. Может быть, я прошу ответы «в первую очередь на основе мнения», но мне действительно нужно знать, как структурировать от четырех до шести слабо зависимых действий, все из которых кажутся ожидающими всего как анонимного и встроенного вызоваследующий шаг. Я мог бы реализовать Runnable для каждой возможной необходимости загрузить все (см. Код для порядка операций), но затем я получил бы 6 различных внутренних классов, каждый из которых имел свои небольшие знания о работе моегоКласс PortalManager.
Я не супер на Java или Android. Если бы это была проблема .NET в классической форме win, и Esri настаивала на этом неудобном шаблоне кодирования, я просто создала бы модель событий / подписок с несколькими событиями, которые могли бы перечислять различные шаги загрузки, а затем подходящие методы для выполнения ожидаемой работы. .
Я не очень беспокоюсь о том, чтобы приложение работало, я стараюсь не писать хреновый код. Внедрение 400 строк кода, вложенных в шесть уровней глубины, так что, по сути, все является вызовами событий, в любом случае пахнет очень плохо. Ниже по сути то, что я делаю, но оно не может продолжать вкладывать все глубже и глубже.
public Portal getPortalInstance
{
Portal portal = new Portal();
//do a lot of work setting it up
//this is equivalent to portal.addDoneLoadingListener( new Runnable() { @override public void run() { } }
portal.addDoneLoadingListener( {
() ->
if( portal.getLoadStatus() == LoadStatus.LOADED ){
//do a lot of work authenticating the user
//now set up the map instance so licensing order is correct
//do a lot of work reading feature classes
//get a specific feature layer
PortalItem portalItem = getPortalItem( portal , "itemID" );
portalItem.addDoneLoadingListener( {
() ->
if( portalItem.getLoadStatus() == LoadStatus.LOADED ){
//read the item and item feature table, get a list of available stuff
FeatureLayer featureLayer = new FeatureLayer( portalItem , 0 );
//read some attributes of the layer and do more work
featureLayer.addDoneLoadingListener( {
() ->
if( featureLayer.getLoadStatus() == LoadStatus.LOADED ){
//do a map setup call
//keep going into more and more code, with more inline new Runnables()
//feel shame at a 400 line code block that is impossible to follow
}
else{
//manage a feature layer load failure
}
});
featureLayer.loadAsync();
}
else{
//manage a portal item load failure
}
});
portalItem.loadAsync();
}
else{
//manage a connection failure
}
});
portal.loadAsync();
}