Обработка кнопки возврата в компоненте навигации Android

Ну, здесь много ненужного дублирования кода.

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

Попробуйте следующее:

public MultiFileReadingThread(String name, List<File> inputFiles, File outputFile) {
    this.writer = new BufferedWriter(new FileWriter(outputFile));
    this.name = name;
    this.files = inputFiles;
}

@Override
public void run() {
    SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss:ms");
    System.out.println("Start Time : " + name + formatter.format(System.currentTimeMillis()));
    //readFile();
    if(i == 1){

    }
    writeIntoSharedBufferedWriter();
    System.out.println("End Time : " + name +  formatter.format(System.currentTimeMillis()));
}

public void writeIntoBufferedWriter(){
    for(File f : files){
        try{
        BufferedReader r = new BufferedReader(new FileReader(f));
        String line = null;
        while((line = r.readLine()) != null){
            writer.write(line);
            writer.write("\n");
        }
        } catch(Exception ex){
            ex.printStackTrace();
        }
    }
}

Не забывайте, что вы Также вам нужно закрыть BufferedReader и BufferedWriter.

Threading может быть трудным и, к сожалению, нет единого учебника или ресурса для предоставления всей необходимой вам информации. Я предлагаю прочитать каждый, который вы можете найти, несколько раз. Попытка реализовать многопоточность, прежде чем у вас будет сильное понимание предмета, может привести к множеству проблем. Иногда проблемы с резьбой не проявляются до конца жизненного цикла приложений, когда для их исправления требуются значительные изменения.

24
задан Kiryl Tkach 19 May 2019 в 14:00
поделиться

5 ответов

Рекомендуемый метод работал на меня, но после обновления моей библиотеки implementation 'androidx.appcompat:appcompat:1.1.0'

Реализация как ниже

 val onBackPressedCallback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // Handle the back button event
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(this, onBackPressedCallback)

Kotlin

использования
0
ответ дан Gstuntz 14 October 2019 в 12:49
поделиться

В зависимости от Вашей логики, если Вы хотите закрыть только текущий фрагмент, необходимо передать viewLifecycleOwner, код показывают ниже:

   requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            requireActivity().finish()
        }
    })

Однако, если Вы хотите закрыть приложение на backPressed, неважно, от того, какой фрагмент (вероятно, Вы не хотели бы это!), не передавайте viewLifecycleOwner. Также, если Вы хотите отключить кнопку "Назад", ничего не делайте в handleOnBackPressed (), смотрите ниже:

 requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            // do nothing it will disable the back button
        }
    })
0
ответ дан 27 November 2019 в 17:39
поделиться

Я записанный в основном виде деятельности как это,

override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.my_nav_host_fragment).navigateUp(appBarConfiguration)
    }   
3
ответ дан 27 November 2019 в 17:39
поделиться

При использовании BaseFragment для приложения затем, можно добавить onBackPressedDispatcher к основному фрагменту.

//Make a BaseFragment for all your fragments
abstract class BaseFragment : Fragment() {

private lateinit var callback: OnBackPressedCallback

/**
 * SetBackButtonDispatcher in OnCreate
 */

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setBackButtonDispatcher()
}

/**
 * Adding BackButtonDispatcher callback to activity
 */
private fun setBackButtonDispatcher() {
    callback = object : OnBackPressedCallback(true) {
        override fun handleOnBackPressed() {
            onBackPressed()
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(this, callback)
}

/**
 * Override this method into your fragment to handleBackButton
 */
  open fun onBackPressed() {
  }

}

Переопределение onBackPressed () в Вашем фрагменте путем расширения basefragment

//How to use this into your fragment
class MyFragment() : BaseFragment(){

private lateinit var mView: View

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    mView = inflater.inflate(R.layout.fragment_my, container, false)
    return mView.rootView
}

override fun onBackPressed() {
    //Write your code here on back pressed.
}

}

0
ответ дан 27 November 2019 в 17:39
поделиться

Это - 2 строки кода, может прислушаться назад к нажатию, от фрагментов, [ПРОТЕСТИРОВАННЫЙ и РАБОТАЮЩИЙ]

  requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {
        @Override
        public void handleOnBackPressed() {

            //setEnabled(false); // call this to disable listener
            //remove(); // call to remove listener
            //Toast.makeText(getContext(), "Listing for back press from this fragment", Toast.LENGTH_SHORT).show();
     }
0
ответ дан 27 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

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