Фрагменты Android: обновление текста в потоке после переключения фрагмента

Я пытаюсь создать небольшое приложение для записи голоса с 3 вкладками в виде фрагментов. Я узнал, что 2 вкладки будут созданы с помощью onCreateView, когда я запущу приложение. Сначала я ожидал, что onCreatView в PlaceHolderFragment будет вызываться для отображения нового фрагмента при каждом переключении фрагмента. (Это простая демонстрация Fragment Activity Demo в Android Studio, которую я расширил для записи голоса).

        @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView;

        Integer section = getArguments().getInt(ARG_SECTION_NUMBER);

        switch (section) {
            case 1:

                rootView = inflater.inflate(R.layout.fragment_main, container, false);

                TextView textView = (TextView) rootView.findViewById(R.id.section_label);
                textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));

                final TextView timeView;
                timeView = (TextView) rootView.findViewById(R.id.timeView);

                //Button start_stop;
                final Button start_stop = (Button) rootView.findViewById(R.id.button);

                start_stop.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {

                        MainActivity mainAct = (MainActivity) getActivity();

                        if (recorder == null) {
                            recorder = new MediaRecorder();
                        }

                        if (mainAct.running) {

                            recorder.stop();
                            start_stop.setText("start recording");

                            mainAct.running = false;
                            mainAct.time = 0;

                        } else {

                            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                            recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
                            //recorder.setOutputFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/myrecording.mp3");
                            recorder.setOutputFile(getActivity().getApplicationContext().getFilesDir() + "/audio.mp3");
                            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
                            try {
                                recorder.prepare();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }

                            recorder.start();
                            mainAct.running = true;
                            mainAct.initThread(timeView);

                            start_stop.setText("stop recording");
                        }

                    }
                });

                break;

            case 2:

                rootView = inflater.inflate(R.layout.fragment_sound, container, false);
                break;

            case 3:

                rootView = inflater.inflate(R.layout.fragment_pics, container, false);
                break;

            default:
                rootView = null;
                break;
        }

        return rootView;
    }`

Записанная продолжительность будет отображаться в TextView. Время обновляется в новом потоке.

    public void initThread(final TextView timeView) {
    refreshThread = new Thread(new Runnable() {
        public void run() {
            while (running) {
                time = time + 0.1;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ex) {
                    Logger.getLogger(MainActivity.class.getName()).log(Level.SEVERE, null, ex);
                }
                runOnUiThread(new Runnable() {
                    public void run() {
                        timeView.setText(getString(R.string.time_string, String.format("%.1f", time)));
                    }
                });

            }
        }
    });
    refreshThread.start();
}

пока все работает нормально - запись идет, когда я нахожусь на первой вкладке (которая отображает продолжительность) - даже когда я переключаюсь на вторую вкладку. Но когда я переключаюсь на третью вкладку и возвращаюсь к первой вкладке, продолжительность больше не отображается.

точно: когда я перешел с вкладки 1 на вкладку 2 и обратно на вкладку 1, время все еще обновляется, как и ожидалось. При переходе с вкладки 1 на вкладку 2, затем на вкладку 3 и обратно на вкладку 2 и на вкладку 1 все кажется начальным на этом экране. Время больше не будет обновляться - TextView имеет исходный текст. Я отладил приложение, когда возвращаюсь с вкладки 3, угроза все еще работает, но TextView не получит текущую продолжительность.

Может кто-нибудь, пожалуйста, дайте мне подсказку для этого поведения? Я думаю, что при переходе на вкладку 3 фрагмент для вкладки 1 будет уничтожен, но при переходе на вкладку 1 он будет построен заново.

Как решить эту проблему?

Спасибо


person Malungo    schedule 08.11.2015    source источник
comment
да, вы совершенно правы .. пожалуйста, прочитайте это: stackoverflow.com/questions/8348707/   -  person Martin Pfeffer    schedule 08.11.2015