Как ориентироваться по кругу - PullRequest
0 голосов
/ 25 февраля 2011

заголовок может быть не очень описательным, но я не мог придумать лучшего.

Проблема в следующем: у меня один экран (ScreenOne) со ссылкой на другой экран (ScreenTwo).На ScreenTwo есть ссылка на ScreenOne.

Я реализовал это через пользовательские RichTextFields и пользовательский ChangeListener.

Теперь проблема в том, что я продолжаю получать StackOverflowError!Есть ли способ перемещаться туда-сюда таким образом?

regards matt

public class MyApp extends UiApplication
{
    public static void main(String[] args)
    {
        MyApp theApp = new MyApp();       
        theApp.enterEventDispatcher();
    }

    public MyApp()
    {
        ScreenOne so = ScreenProvider.getInstance().getScreenOne();
        so.initialize();
        ScreenProvider.getInstance().getScreenTwo().initialize();
        pushScreen(so);
    }    
}

public class ScreenOne extends MainScreen {
    MyTextField link;

    public ScreenOne() {
        link = new MyTextField("FirstScreen");
        add(link);
    }

    public void initialize(){
        link.setChangeListener((FieldChangeListener) new MyFieldChangeListener(ScreenProvider.getInstance().getScreenTwo()));
    }
}

public class ScreenTwo extends MainScreen {
    MyTextField link;

    public ScreenTwo() {
        link = new MyTextField("SecondScreen");
        add(link);
    }

    public void initialize(){
        link.setChangeListener((FieldChangeListener) new MyFieldChangeListener(ScreenProvider.getInstance().getScreenOne()));
    }
}

public class MyFieldChangeListener implements FieldChangeListener {

    private Screen nextScreen;

    public MyFieldChangeListener(Screen nextScreen) {
        this.nextScreen = nextScreen;
    }

    public void fieldChanged(Field field, int context) {
        UiApplication.getUiApplication().pushScreen(nextScreen);
    }
}

public class MyTextField extends RichTextField {
    public MyTextField() {
        super();
    }

    public MyTextField(String text) {
        super(text);
    }

    protected boolean touchEvent(TouchEvent message) {
        if (TouchEvent.CLICK == message.getEvent()) {
            FieldChangeListener listener = getChangeListener();
            if (null != listener)
                listener.fieldChanged(this, 1);
        }
        return super.touchEvent(message);
    }
}

public class ScreenProvider {
    private static ScreenProvider instance = null;

    private ScreenProvider(){}

    public static ScreenProvider getInstance() {
        if (instance == null) {
            instance = new ScreenProvider();
        }
        return instance;
    }

    private ScreenOne screenOne = new ScreenOne();
    private ScreenTwo screenTwo = new ScreenTwo();

    public ScreenOne getScreenOne() {
        return screenOne;
    }

    public ScreenTwo getScreenTwo() {
        return screenTwo;
    }
}

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

Конструктор ScreenOne создает экземпляр ScreenTwo, а конструктор ScreenTwo создает экземпляр ScreenOne.У вас здесь бесконечный цикл.

1 голос
/ 25 февраля 2011

Относительно редакции 5 этого вопроса:

new ScreenProvider () -> new ScreenOne () -> ScreenProvider.getInstance () -> new ScreenProvider () ->...

все еще бесконечно.Опять же, проблема в том, что вы пытаетесь настроить цикл с помощью конструкторов объектов.Сначала нужно создать объекты, затем назначить следующий и предыдущий.

Относительно редакции 4 этого вопроса:

getScreenOne () -> new ScreenOne() -> getScreenTwo () -> new ScreenTwo () -> getScreenOne () -> newScreenOne () -> ...

у вас все еще есть бесконечный цикл, потому что конструкторы пытаютсяхранить экземпляр друг друга.Сначала нужно создать объекты, затем добавить циклические ссылки.

0 голосов
/ 25 февраля 2011

В вашем ScreenProvider вам не нужно делать screen1 / screen2 статичным - они являются членами экземпляра singleton.

Помимо этого, другая проблема, которую я вижу в этой текущей версии, заключается в том, что вы собираетесь помещать экран в стек - это уже в стеке. Попробуйте сначала открыть предыдущий экран.

0 голосов
/ 25 февраля 2011

Эта ошибка переполнения, вероятно, является результатом бесконечного цикла, вызванного постоянным переходом из ScreenOne и ScreenTwo.Не могли бы вы описать, чего вы на самом деле хотели бы достичь, и / или показать фрагмент кода?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...