Для синхронизации потоков я предпочитаю использовать 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.");
}
}
}
https://developer.android.com/reference/android/app/FragmentManager.html#isStateSaved ()
Используйте isStateSaved
, чтобы избежать потери состояния при выполнении транзакции .
И я думаю, компонент навигации Android может быть более простым способом навигации между фрагментами.
Попробуйте это:
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.FragmentToBeReplaced,theFragmentToBeAdded);
ft.commit();