Я исправил эту проблему, вызвав функцию ниже в viewdidload или viewWillAppear или viewDidAppear, чтобы проверить разрешение для вашего приложения.
func checkPermission() {
let photoAuthorizationStatus = PHPhotoLibrary.authorizationStatus()
switch photoAuthorizationStatus {
case .authorized:
print("Access is granted by user")
case .notDetermined:
PHPhotoLibrary.requestAuthorization({
(newStatus) in
print("status is \(newStatus)")
if newStatus == PHAuthorizationStatus.authorized {
/* do stuff here */
print("success")
}
})
print("It is not determined until now")
case .restricted:
// same same
print("User do not have access to photo album.")
case .denied:
// same same
print("User has denied the permission.")
}
}
Вы пытаетесь показать диалог после того, как вы вышли из Activity.
[EDIT]
Этот вопрос является одним из лучших поисков в Google для разработчиков Android, поэтому добавление нескольких важных моментов из комментариев, которые могут быть более полезными для будущего исследователя, без углубленного обсуждения комментариев.
Ответ 1:
Вы пытаетесь показать Диалог после того, как вы вышли из Activity.
blockquote>Ответ 2
В некоторых случаях эта ошибка может немного вводить в заблуждение (хотя ответ по-прежнему полностью точнее), то есть в моем случае в AsyncTask было выбрано необработанное исключение, которое вызвало завершение Activity, тогда открытый прогрессdialog вызвал это исключение .. поэтому «реальное» исключение было немного раньше в журнале
< / blockquote>Ответ 3
Убрать вызов () в экземпляре Dialog, который вы создали до выхода из своей деятельности, например in onPause () или onDestroy ()
blockquote>
if (mActivity != null && !mActivity.isFinishing() && mProgressDialog != null && mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
}
Как правило, эта проблема возникает из-за диалога прогресса: вы можете решить эту проблему, используя любой из следующих методов в своей деятельности:
// 1):
@Override
protected void onPause() {
super.onPause();
if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
{
yourProgressDialog.cancel();
}
}
// 2) :
@Override
protected void onDestroy() {
super.onDestroy();
if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
{
yourProgressDialog.cancel();
}
}
Если вы используете AsyncTask
, возможно, сообщение в журнале может быть обманным. Если вы посмотрите в своем журнале, вы можете найти еще одну ошибку, возможно, одну из ваших doInBackground()
методов вашего AsyncTask
, которая заставит ваш текущий Activity
взорваться, и, таким образом, после возвращения AsyncTask
. Знаете, вы знаете все остальное. Некоторые другие пользователи уже объяснили, что здесь: -)
Вы можете получить это исключение просто простой / немой ошибкой, например (случайно), вызвав finish()
после отображения AlertDialog
, если вы пропустите заявление о вызове break в инструкции switch ...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.new_button:
openMyAlertDialog();
break; <-- If you forget this the finish() method below
will be called while the dialog is showing!
case R.id.exit_button:
finish();
break;
}
}
Метод finish()
закроет Activity
, но AlertDialog
все еще отображается!
Итак, когда вы пристально смотрите на код, ищите плохого проблемы с потоками или сложное кодирование и т. д., не упускайте из виду лес для деревьев. Иногда это может быть просто что-то такое же простое и немое, как недостающий оператор break. :) [/ Д2]
Попробуйте ввести код, он будет работать в любое время, когда вы отпустите диалог прогресса, и он увидит, доступен ли его экземпляр или нет.
try {
if (null != progressDialog && progressDialog.isShowing()) {
progressDialog.dismiss();
progressDialog = null;
}
} catch (Exception e) {
e.printStackTrace();
}
Не только пытайтесь показать предупреждение, но также можно вызвать, когда вы закончите конкретный экземпляр активности и попытаетесь запустить новую активность / службу или попытайтесь ее остановить.
Пример:
OldActivity instance;
oncreate() {
instance=this;
}
instance.finish();
instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
Это не ответ на вопрос, но он имеет отношение к теме.
Если действие определило атрибут в манифесте
android:noHistory="true"
, то после выполнения onPause ( ), контекст активности теряется. Таким образом, все представление, использующее этот контекст , может дать эту ошибку.
progessdialog.show()
.. и progressdialog.hide()
в asynctask
той же активности, а не onPause()
из activity
?? взгляните на мою проблему ... stackoverflow.com/questions/39332880/…
– Bhuro
5 September 2016 в 14:39
Была проблема, когда я закончил Activity, когда ProgressDialog все еще был показан.
Итак, сначала скройте диалоговое окно, а затем завершите действие.
Просто убедитесь, что ваша активность не закрывается неожиданно из-за некоторых исключений, возникающих где-то в вашем коде. Как правило, это происходит в async-задаче, когда активность сталкивается с принудительным закрытием в doinBackground, а затем asynctask возвращает метод onPostexecute.
Я вызвал эту ошибку, ошибочно называя hide()
вместо dismiss()
на AlertDialog
.
В моем случае причина заключалась в том, что я забыл включить разрешение в файл манифеста Android.
Как я узнал? Ну, точно так же, как @Bobby говорит в комментарии под принятым ответом, просто прокрутите дальше до ваших журналов, и вы увидите первую причину или событие, которое действительно выбросило исключение. По-видимому, сообщение «Активность просочилось в окно, которое было первоначально добавлено» - это только исключение, возникшее в результате первого исключения.
У меня было такое же непонятное сообщение об ошибке, и я понятия не имел, почему. Учитывая подсказки из предыдущих ответов, я изменил свои вызовы без GUI на mDialog.finish (), чтобы быть mDialog.dismiss (), и ошибки исчезли. Это не повлияло на поведение моего виджета, но оно было сбито с толку и вполне могло помешать важной утечке памяти.
Отключить диалог, когда действие уничтожает
@Override
protected void onDestroy()
{
super.onDestroy();
if (pDialog!=null && pDialog.isShowing()){
pDialog.dismiss();
}
}
Лучшее решение - это просто добавить диалог в диалог try catch и reject при возникновении исключения
Просто используйте ниже код
blockquote>try { dialog.show(); } catch (Exception e) { dialog.dismiss(); }
dialog.dismiss()
также выдает ошибку
– Ashu Kumar
17 August 2018 в 11:25
Попробуйте этот код:
public class Sample extends Activity(){
@Override
public void onCreate(Bundle instance){
}
@Override
public void onStop() {
super.onStop();
progressdialog.dismiss(); // try this
}
}
progressdialog.dismiss();
это может создать исключение NullPointerException.
– tpk
3 October 2016 в 06:35
У меня такая же проблема. ошибка была не в Dialog
, а в EditText
. Я пытался изменить значение Edittext
внутри Assynctask
. единственное, что я мог решить, - это создать новый runnable
.
runOnUiThread(new Runnable(){
@Override
public void run() {
...
}
});
У меня была такая же проблема, и я нашел эту страницу, и, хотя моя ситуация была другой, я назвал finish
из блока if
до того, как он определил окно предупреждения.
Итак, просто вызов dismiss
не будет работать (как это еще не было сделано), но после прочтения ответа Алекса Воловой и осознания этого было поле предупреждения, вызывающее его , Я попытался добавить оператор return сразу после финиша внутри этого блока if
и устранил проблему.
Я подумал, как только вы позвонили, он остановил все и закончил прямо там, но это не так. Кажется, он доходит до конца блока кода, в котором он заканчивается.
Итак, если вы хотите реализовать ситуацию, когда иногда она заканчивается, прежде чем делать какой-то код, вы должны поставить оператор возврата сразу после финиша, или он продолжит движение и будет действовать как финиш был вызван в конце блока кода не там, где вы его назвали. Вот почему я получал все эти странные ошибки.
private picked(File aDirectory){
if(aDirectory.length()==0){
setResult(RESULT_CANCELED, new Intent());
finish();
return;
}
AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
alert
.setTitle("Question")
.setMessage("Do you want to open that file?"+aDirectory.getName());
alert
.setPositiveButton("OK", okButtonListener)
.setNegativeButton("Cancel", cancelButtonListener);
alert.show();
}
Если вы не поместите возвращение сразу после того, как я позвонил в финал там, он будет действовать так, как если бы вы вызвали его после alert.show();
, и, следовательно, будет сказано, что окно просочилось, закончив сразу после того, как вы запустили диалог, хотя это не так, но все же это так.
Я думал, что добавлю это как здесь так как это показывает, что команда финиша действовала по-другому, тогда я подумал, что это так, и я бы предположил, что есть другие люди, которые думают так же, как и я, прежде чем я это обнаружил.
Ответы на этот вопрос были правильными, но немного смущающими для меня, чтобы понять, почему. После игры около 2 часов причина этой ошибки (в моем случае) ударила меня:
Вы уже знаете, что, прочитав другие ответы, ошибка X has leaked window DecorView@d9e6131[]
означает, что диалог был открыт, когда ваш приложение закрыто. Но почему?
Возможно, ваше приложение разбилось по какой-то другой причине, пока ваш диалог был открыт
. Это приведет к закрытию вашего приложения из-за некоторой ошибки в вашем коде, в открывшемся диалоговом окне одновременно с закрытием вашего приложения из-за другой ошибки.
Итак, просмотрите свое логическое. Решите первую ошибку, а затем вторая ошибка решит себя
Одна ошибка вызывает другую, которая вызывает другую, например DOMINOS!
Это случилось со мной, когда я использую ProgressDialog
в AsyncTask
. Фактически я использую метод hide()
в onPostExecute
. Основываясь на ответе @Alex Volovoy, я должен использовать dismiss()
с ProgressDialog
, чтобы удалить его в onPostExecute и его сделать.
progressDialog.hide(); // Don't use it, it gives error
progressDialog.dismiss(); // Use it
AsyncTask
, и вы показываете Dialog
, то происходит что-то, что делает вызов Activity
onPause()
(может быть, какая-то логика в вашей AsyncTask сама, как слушатель, тогда она просачивается). 2) Как уже упоминалось выше, Dialog
, который был создан с этим Activity
Context
, никогда не отклоняется, а Activity
движется дальше.
– tricknology
21 October 2017 в 08:36
Это может помочь.
if (! isFinishing()) {
dialog.show();
}
Проблема по мне заключается в том, что вы пытаетесь вызвать диалог сразу после того, как активность завершается, поэтому, согласно мне, вы можете дать некоторую задержку с помощью Handler, и вы будете решены, например:
Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
dialog.show();
//or
dialog.dismiss();
}
},100);
Исключенные окна исключений имеют две причины:
1), показывая диалог, когда контекст активности не существует, чтобы решить эту проблему, вы должны показать это диалоговое окно, только вы уверены, что активность существует:
if(getActivity()!= null && !getActivity().isFinishing()){
Dialog.show();
}
2) не отклонить диалог соответствующим образом, чтобы решить этот код:
@Override
public void onDestroy(){
super.onDestroy();
if ( Dialog!=null && Dialog.isShowing() ){
Dialog.dismiss();
}
}
Эта проблема возникает при попытке показать диалог после того, как вы вышли из Activity.
Я просто решил эту проблему, просто записав следующий код:
@Override
public void onDestroy(){
super.onDestroy();
if ( progressDialog!=null && progressDialog.isShowing() ){
progressDialog.cancel();
}
}
В принципе, из какого класса вы начали progressDialog, переопределите метод onDestroy и сделайте это. Он решил проблему «Проблема с утечкой окна».
Недавно я столкнулся с той же проблемой.
Причина этой проблемы в том, что закрытие операции перед диалогом отменяется. Существуют разные причины для того, чтобы это произошло. Те, о которых упоминалось выше, также верны.
Я попал в ситуацию, потому что в потоке я вызывал функцию, которая выбрасывала исключение. Из-за чего окно было уволено и, следовательно, исключение.
Это может быть, если у вас есть ошибка в функции doInBackground()
и есть этот код.
Попытайтесь добавить диалог наконец. Сначала проверьте и исправьте функцию doInBackground()
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(CreateAccount.this);
pDialog.setMessage("Creating Product..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
protected String doInBackground(String...args) {
ERROR CAN BE IS HERE
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
Решение заключается в вызове dismiss()
на Dialog
, созданном вами в viewP.java:183
, перед выходом из Activity
, например. в onPause()
. Все Window
s & amp; Dialog
s должны быть закрыты перед выходом из Activity
.
Вы должны сделать объект Progressdialog
в onPreExecute
методе AsyncTask
, и вы должны dismiss
его использовать по методу onPostExecute
.