#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();
}
}