Панель закусок не отображается мгновенно

#java #android

#java #Android

Вопрос:

я пытаюсь сохранить изображение при нажатии на ImageView. Поскольку сохранение занимает некоторое время, я хочу иметь какой-то индикатор того, что приложение работает. Я пытался использовать Snackbar для этого. Мой код выглядит примерно так:

 File image = new File(directory, "image.png");

        if(!image.exists()){

            Snackbar bar = Snackbar.make(getActivity().findViewById(R.id.some_layout), "snackText", Snackbar.LENGTH_INDEFINITE);
            bar.show();

            FileOutputStream outStream = null;
            try {
               outStream = new FileOutputStream(image);
               bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
               outStream.flush();
               outStream.close();
            } catch (FileNotFoundException e) {
               e.printStackTrace();
            } catch (IOException e) {
               e.printStackTrace();
            }

            bar.dismiss();
        }
  

Все, что находится внутри public void onClick(View view) этого ImageView.
Проблема в том, что панель закусок отображается только после сохранения изображения. Я попытался принудительно обновить пользовательский интерфейс с помощью invalidate() и попробовал это без запуска нового потока с тем же результатом.
Любые идеи приветствуются!

Комментарии:

1. Snackbar не предназначен для индикатора загрузки, насколько я знаю об этом, snackbar автоматически отключится через некоторое время, и последнее, что вы делаете, это кодируете, какой файл сохранения добавляется в отдельный поток, поэтому, когда вы выполняете t.start(); он запускает этот поток, но сразу после того, как он найдет bar.dismiss (); и он отключит snackbar

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

3. В этом случае вам следует использовать dialog

4. Если вы запускаете этот код в главном потоке, тогда проблема ясна, вы должны запускать задачи с интенсивными вычислениями и ввод-вывод в фоновом потоке, если вы блокируете поток пользовательского интерфейса, у snackbar не будет возможности отображаться до завершения операции с файлом.

5. Вы можете использовать AsyncTask для решения этой проблемы. Показывать панель закусок методом предварительного выполнения. Вы работаете в doingBackground. После сохранения файла или завершения задачи спрячьте панель закусок в методе postExecute.

Ответ №1:

Не используйте snackbar здесь, отредактируйте свой код следующим образом: if(!image.exists()){

         final ProgressDialog progressDialog =ProgressDialog.show(this, "","Please Wait...", true);

        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                FileOutputStream outStream = null;
                try {
                    outStream = new FileOutputStream(image);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outStream);
                    outStream.flush();
                    outStream.close();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progressDialog.dismiss();
                    }
                });

            }

        });
        t.start();

        try {
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }