Как заменить верхний фрагмент?

Для синхронизации потоков я предпочитаю использовать CountDownLatch, который помогает потокам ждать завершения процесса. В этом случае рабочий класс настроен с экземпляром CountDownLatch с заданным счетчиком. Вызов метода await будет блокироваться до тех пор, пока текущий счетчик не достигнет нуля из-за вызова метода countDown или набора тайм-аута. Этот подход позволяет мгновенно прерывать поток, не дожидаясь истечения заданного времени ожидания:

public class IndexProcessor implements Runnable {

    private static final Logger LOGGER = LoggerFactory.getLogger(IndexProcessor.class);

    private final CountDownLatch countdownlatch;
    public IndexProcessor(CountDownLatch countdownlatch) {
        this.countdownlatch = countdownlatch;
    }


    public void run() {
        try {
            while (!countdownlatch.await(15000, TimeUnit.MILLISECONDS)) {
                LOGGER.debug("Processing...");
            }
        } catch (InterruptedException e) {
            LOGGER.error("Exception", e);
            run = false;
        }

    }
}

Когда вы хотите завершить выполнение другого потока, выполните countDown на CountDownLatch и join нить в основной поток:

public class SearchEngineContextListener implements ServletContextListener {

    private static final Logger LOGGER = LoggerFactory.getLogger(SearchEngineContextListener.class);

    private Thread thread = null;
    private IndexProcessor runnable = null;
    private CountDownLatch countdownLatch = null;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        countdownLatch = new CountDownLatch(1);
        Thread thread = new Thread(new IndexProcessor(countdownLatch));
        LOGGER.debug("Starting thread: " + thread);
        thread.start();
        LOGGER.debug("Background process successfully started.");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        LOGGER.debug("Stopping thread: " + thread);
        if (countdownLatch != null) 
        {
            countdownLatch.countDown();
        } 
        if (thread != null) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                LOGGER.error("Exception", e);
            }
            LOGGER.debug("Thread successfully stopped.");
        } 
    }
}
0
задан BArtWell 15 January 2019 в 22:53
поделиться

2 ответа

https://developer.android.com/reference/android/app/FragmentManager.html#isStateSaved ()

Используйте isStateSaved, чтобы избежать потери состояния при выполнении транзакции .

И я думаю, компонент навигации Android может быть более простым способом навигации между фрагментами.

0
ответ дан theJian 15 January 2019 в 22:53
поделиться

Попробуйте это:

    FragmentManager fm = getFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.FragmentToBeReplaced,theFragmentToBeAdded);
    ft.commit();
0
ответ дан Marcel.af 15 January 2019 в 22:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: