На самом деле вам повезло - программа, записывающая файл, блокирует его, поэтому вы не можете его открыть. Если он не заблокировал его, вы скопировали бы частичный файл, не имея никакой идеи, что есть проблема.
Когда вы не можете получить доступ к файлу, вы можете предположить, что он все еще используется (еще лучше - попробуйте открыть его в эксклюзивном режиме и посмотрите, не открывает ли кто-нибудь еще его, вместо того, чтобы угадывать из-за отказа File.Copy). Если файл заблокирован, вам придется скопировать его в другое время. Если он не заблокирован, вы можете скопировать его (здесь есть небольшой потенциал для состояния гонки).
Когда это «другое время»? Я не помню, когда FileSystemWatcher отправляет несколько событий на файл - проверьте это, вам может быть достаточно просто проигнорировать событие и ждать другого. Если нет, вы всегда можете настроить время и перепроверять файл за 5 секунд.
только что узнал мою ошибку.
В моем MainActivity.java я импортировал android.support.v4.app.Fragment;
, а в моем LoginFragment.java я импортировал android.app.Fragment;
. Я изменил это на то же самое, и теперь fm.findFragmentById(R.id.login_fragment)
возвращает правильный фрагмент.
Ответ Kar0t прекрасно, но это может кому-то помочь. В моем случае у меня был фрагмент внутри фрагмента, и я получил неправильный FragmentManager. Мне просто нужно было позвонить:
getChildFragmentManager()
, а затем просто найти фрагмент как обычно:
fm.findFragmentById(R.id.fragment)
На самом деле не связано с конкретным вопросом, но связано с получением null
на findFragmentById
, если вы вызываете findFragmentById
сразу после коммита, он вернет ноль или последний фрагмент (перед коммитом), причина в том, что коммит делать асинхронно запрос.
Из документов:
Планирует фиксацию этой транзакции. Фиксация происходит не сразу; это будет запланировано как работа над основным потоком, которая будет сделана в следующий раз, когда поток будет готов.
Если вам нужно немедленно findFragmentById
, например, изменить цвет текста строки состояния после добавления фрагмента, позвоните executePendingTransactions()
после commit()
getSupportFragmentManager().executePendingTransactions();
//call findFragmentById
У меня также была проблема, потому что я был в дочернем фрагменте. Я мог бы использовать:
supportFragmentManager.fragments.forEach {
it.childFragmentManager.fragments.forEach { fragment ->
if (fragment is HomeFragment) {
//do something
}
}
, но один сотрудник оптимизировал его с помощью:
if( findNavController(R.id.nav_host_fragment).currentDestination?.id == R.id.homeFragment) {
// do something
}