활동이 원래 추가 된 창을 유출했습니다


1161

이 오류는 무엇이며 왜 발생합니까?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at dalvik.system.NativeStart.main(Native Method)

6
다른 고전은 방향이 바뀌는 경우입니다 : stackoverflow.com/questions/1111980/…
rds

답변:


1559

활동을 종료 한 후 대화 상자를 표시하려고합니다.

[편집하다]

이 질문은 안드로이드 개발자를위한 Google의 최고 검색 중 하나이므로 주석에서 중요한 점을 몇 개 추가하면 주석 심도 대화에 가지 않고 향후 조사자에게 더 도움이 될 수 있습니다.

답변 1 :

활동을 종료 한 후 대화 상자를 표시하려고합니다.

답변 2

이 오류는 일부 상황에서 약간의 오해의 소지가 있습니다 (응답은 여전히 ​​정확하지만). 예를 들어 처리되지 않은 예외가 AsyncTask에서 발생하여 활동이 종료되고 열린 진행 대화 상자 에서이 예외가 발생했습니다. 로그에서 '실제'예외는 조금 더 일찍

답변 3

활동을 종료하기 전에 생성 한 Dialog 인스턴스 (예 : onPause () 또는 onDestroy ())에서 dismiss ()를 호출합니다.


2
@Override public void onStop () {if (dialog! = null) {dialog.dismiss (); 대화 상자 = null; }}
Md.Tarikul Islam

14
8 년이 지난 후에도 여전히 관련이 있습니다! AlertDialog (응답 2)를 표시하려고하는 동안 활동이 닫혀서 예외가 발생했습니다. 결국 나는 앱이 "null"오브젝트를 씬에 추가하고 있다는 것을 알았지 만 (그렇지 않았지만 수행하지는 않았지만) 추가 예외를주지 않았고 모든 것이 "누수 됨" window "예외가 대신 발생합니다.
Neph

열려있는 모든 대화 상자를 스캔하고 onStop ()에서 모두 닫을 수 있습니까? 항목을 클릭하면 ListView에 대화 상자가 생성됩니다. onStop에서 참조를 검색하는 방법을 잘 모르겠습니다.
Myoch

1
답변 3이 가장 좋습니다. 나를 위해 크게 일했습니다. 감사합니다 kaze, Alex !!
bansode를 amit

루프에서 대화 상자를 표시하는 경우 추가 팁 활동 완료 후 루프가 종료되었는지 확인
Thecarisma

405

해결책은 에서 종료하기 전에 에서 생성 한를 호출 dismiss()하는 Dialog것입니다 ( 예 : in) . 를 떠나기 전에 모든 S & S를 닫아야합니다 .viewP.java:183ActivityonPause()WindowDialogActivity


3
따라서 사용자가 전화를 돌리면 모든 대화 상자가 해제되어야합니까 ?? 소리가 안 들려요.
LarsH

보시다시피 @LarsH, 내 대답은 7 년 이상 전에 쓰여졌으며 그 당시에는 사실이었습니다. 나는 더 이상 안드로이드로 작업하지 않지만 문서 에서 볼 수있는 내용에 따라 여전히 사례가 될 수 있지만 안드로이드는 그 이후로 먼 길을 왔습니다.
molnarm

108

를 사용하는 경우 AsyncTask해당 로그 메시지가 기만적 일 수 있습니다. 로그를 살펴보면 다른 방법으로 오류가 발생했을 수 있습니다. 아마도 귀하의 doInBackground()방법으로 AsyncTask인해 전류 Activity가 폭발하여 AsyncTask다시 발생하면 나머지는 알 것입니다. 일부 다른 사용자는 이미 다음과 같이 설명했습니다 :-)


22
때로는 그 경우 실제 예외를 볼 수 없습니다. 실제 예외를 찾으려면 progressDialog.show ()를 주석 처리하고 앱을 다시 실행하십시오. 이제 볼 수 있습니다.
스턱

안녕 여러분! @Stuck에 의해 위에서 언급했듯이 실제 예외도 볼 수 없습니다. 나는 파괴 포인트를 사용하여 추적 내가 방법 내부 응용 프로그램 클래스의 참조를 사용하는 것을 발견 doInBackgroundAsyncTask에 클래스 만 선언하지 않고 AndroidManifest재산 사용하여 파일 android:name이 등이 : android:name="my.package.MyApplicationClass". AsyncTask이를 사용할 때는 항상 메소드 내부에서 경보를 인스턴스화 onPreExecute하고 해제하는 것이 onPostExecute좋습니다.
GFPF

66

내가 실수로 호출하여이 오류를 트리거 hide()대신 dismiss()AlertDialog.


4
정확히 나에게 일어난 일. 또한 hide ()를 호출하고 대화 상자를 null로 설정하는 것도 올바른 대안이 아닙니다.
Lucas Tulio

나는 이것 뒤에 문제를 정말로 알고 싶습니다. 그러나 dismiss () 호출하면 도움이되었습니다!
Karoly

59

switch 문에서 break call 문을 놓친 경우 (예를 들어) 실수로을 finish()표시 한 후 실수로 전화 하여이 예외를 얻을 수 있습니다 AlertDialog...

   @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 문처럼 간단하고 멍청한 것일 수도 있습니다. :)


다소 정확하게 내 문제. 대화 상자가 작성된 후 onClick이 아닌 onError에서 finish를 호출했습니다.
jbass

46

이 질문에 대한 답변은 모두 정확했지만 실제로 왜 그런지 이해하는 것이 약간 혼란 스럽습니다. 약 2 시간 동안 놀아 본 후 (이 경우)이 오류의 이유가 나에게 맞았습니다.

다른 답변을 읽음으로써 X has leaked window DecorView@d9e6131[]오류가 있음은 앱을 닫을 때 대화 상자가 열린 것을 의미합니다. 그런데 왜?

대화 상자가 열려있는 동안 다른 이유로 앱이 다운되었을 수 있습니다.

코드의 버그로 인해 앱이 종료되어 다른 오류로 인해 앱이 닫히는 동안 대화 상자가 계속 열려 있습니다.

따라서 논리를 살펴보십시오. 첫 번째 오류를 해결하면 두 번째 오류가 스스로 해결됩니다.여기에 이미지 설명을 입력하십시오

하나의 오류가 다른 오류를 일으켜 DOMINOS와 같은 다른 오류가 발생합니다!


2
이것은 단지 하나 upvote에있다 .. 또는 우리가 프로그래밍에서 정말 나쁜 믿을 수 없다 하하하 나는 또한 당신의 도미노 비유 좋아
user2161301

첫 번째 오류를 해결하면 두 번째 오류 가 발생하지 않습니다 . 이 비유가 도움이되었습니다.
itabdullah

전화 회전과 같은 인스턴스에서도 "활동"회전이 발생할 수 있습니다.
Sreekanth Karumanaghat '12

36

이 문제는 활동을 종료 한 후 대화 상자를 표시하려고 할 때 발생합니다.

방금 다음 코드를 작성 하여이 문제를 해결했습니다.

@Override
public void onDestroy(){
    super.onDestroy();
    if ( progressDialog!=null && progressDialog.isShowing() ){
        progressDialog.cancel();
    }
}

기본적으로 progressDialog를 시작한 클래스에서 onDestroy 메소드를 대체하고이 방법으로 수행하십시오. "액티비티가 창을 누설했습니다"문제를 해결했습니다.


onDestroy가 호출되는 것은 아닙니다. 해당 코드를 onPause 또는 onStop에 배치하는 것이 좋습니다
Amruta-Pani

19

나는 최근에 같은 문제에 직면했다.

이 문제의 원인은 대화가 닫히기 전에 활동이 닫히기 때문입니다. 위와 같은 여러 가지 이유가 있습니다. 위의 게시물에 언급 된 것도 정확합니다.

스레드에서 예외가 발생하는 함수를 호출했기 때문에 상황에 처했습니다. 그로 인해 창이 닫히고 예외가 발생했습니다.


16

활동이 파괴되면 대화 상자를 닫습니다.

@Override
protected void onDestroy()
{
    super.onDestroy();
    if (pDialog!=null && pDialog.isShowing()){
        pDialog.dismiss();
    }
}

pDialog가 null이면 null 대화 상자의 상태를 쿼리 할 때 오류가 발생합니다.
Jonathan Dunn

1
전혀 그렇지 않습니다 @JonDunn, 첫 번째가 false 인 경우 자바는 두 번째 부울을 처리하지 않기 때문에
matdev가

13

도움이 될 수 있습니다.

if (! isFinishing()) {

    dialog.show();

    }

2
수백 개의 유사한 답변 중에서 창이 있는지 확인하는 방법을 보여주는 사람은 없습니다. 그래서 당신은 시간을 절약 할 수 있습니다. 감사.
kolyaseg

11

나는 같은 모호한 오류 메시지를 보았고 그 이유를 알지 못했습니다. 이전 답변의 단서가 주어지면 GUI 이외의 호출을 mDialog.finish ()에 대한 mDialog.dismiss ()로 변경하고 오류가 사라졌습니다. 이것은 내 위젯의 동작에 영향을 미치지 않았지만 당황스럽고 중요한 메모리 누수를 표시했을 수 있습니다.


finish () 호출 전에 mDialog.hide ()를 수행하고 있음을 알았습니다. 그것을 mDialog.dismiss ()로 변경하면 트릭을 수행했습니다.
mays

11

비디오 플레이어 응용 프로그램에서 이러한 로그를 가져 왔습니다. 이 메시지는 비디오 플레이어가 닫히는 동안 발생했습니다. 흥미롭게도, 나는 무작위로 몇 번의 실행으로 이러한 로그를 한 번 얻었습니다. 또한 내 응용 프로그램은 관련이 없습니다 progressdialog. 마지막으로 아래 구현 으로이 문제를 해결했습니다.

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

OnPausewith를 호출 mVideoView.pause()하고로 설정 visibility을 재정의합니다 GONE. 이렇게하면 " Activity has leaked window"로그 오류 문제를 해결할 수 있습니다.


나는 또한 같은 문제에 직면했다. 코드에 이러한 코드 줄을 추가했지만 작동하지 않고 "android.view.WindowLeaked that was added added"라는 동일한 오류가 발생하고 비디오를 재생하지 않고 "비디오를 재생할 수 없습니다"
User42590

10

나는 같은 문제가 있었고이 페이지를 찾았고 상황이 다르면 경고 상자를 정의하기 전에 블록 finish에서 전화 if했습니다.

따라서 단순히 전화를 걸면dismiss 작동하지 않지만 (아직 작성하지 않은 상태) Alex Volovoy의 답변 을 읽고 경고 상자가 발생했다는 사실을 깨달았습니다. 해당 if블록 내부에서 완료 직후에 return 문을 추가하려고 시도 하여 문제가 해결되었습니다.

일단 당신이 finish라고 부르면 모든 것이 멈추고 바로 끝났다고 생각했지만 그렇지 않습니다. 그것은 코드 블록의 끝으로 가고 마치면 끝납니다.

따라서 때로는 코드를 작성하기 전에 끝나는 상황을 구현하려면 마무리 직후에 return 문을 작성해야합니다. 그렇지 않으면 계속 진행되고 끝에서 호출 된 것처럼 행동합니다. 당신이 그것을 호출하지 않은 코드 블록. 그렇기 때문에 모든 이상한 오류가 발생했습니다.

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

거기에 finish를 호출 한 직후에 return을 넣지 않으면 마치 마치 호출 한 것처럼 작동 alert.show();하므로 대화 상자가 나타나더라도 대화 상자가 나타난 직후에 마무리하여 창에 누출이 발생합니다. 사실이 아니라고 생각합니다.

완료 명령이 다르게 작동했음을 보여주기 때문에 여기에 이것을 추가하겠다고 생각했는데, 내가 생각하기 전에 다른 사람이 있다고 생각합니다.


7

이것은 질문에 대한 답변이 아니지만 주제와 관련이 있습니다.

활동이 매니페스트에서 속성을 정의한 경우

 android:noHistory="true"

그런 다음 onPause ()를 실행하면 활동 컨텍스트가 손실됩니다. 그래서 모든 뷰의 사용하여 컨텍스트하면이 오류를 줄 수 있습니다.


당신은 유사한 어떤 관련이 있습니다 progessdialog.show()..과 progressdialog.hide()에서 asynctask같은 활동의 대신 onPause()에서을 activity?? 내 문제를 살펴보십시오 ... stackoverflow.com/questions/39332880/…
Bhuro

1
그 완벽하게 나를 위해 일하고 : 안드로이드 : noHistory = "true"로
Shohel라나

6

경고를 표시 할뿐만 아니라 특정 활동 인스턴스를 완료하고 새 활동 / 서비스를 시작하거나 중지하려고 할 때 호출 될 수도 있습니다.

예:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));

6

일반적으로이 문제는 진행률 대화 상자로 인해 발생합니다. 활동에서 다음 방법 중 하나를 사용하여이 문제를 해결할 수 있습니다.

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

5

ProgressDialog가 여전히 표시되었을 때 활동을 마친 문제가있었습니다.

먼저 대화 상자를 숨기고 활동을 완료하십시오.


5

이 코드를 사용해보십시오 :

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

5

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

5

내가 사용하고 때 나 한테 일어난 ProgressDialog에서 AsyncTask. 실제로 나는의 hide()방법을 사용 하고 onPostExecute있습니다. @ 알렉스 Volovoy의 답변에 따라 내가 사용할 필요 dismiss()ProgressDialogonPostExecute과 그 수행에 제거 할 수 있습니다.

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it

이것은 실제로 정답이 아닙니다. 대화 상자를 유출하는 방법에는 두 가지가 있습니다. 당신이있는 경우 1) AsyncTask당신이 보여 Dialog, 무언가를 만드는 일이 Activity호출 onPause()수신기와 같은 (당신의 AsyncTask를 자체 어쩌면 몇 가지 논리를, 다음이 누출됩니다. 2)으로는 위에서 언급 한의 Dialog그것과 생성 된이 Activity Context결코 해산 및 Activity이동.
tricknology

5

는 " Activity has leaked window that was originally added...당신은이 후 경고를 표시하려고 할 때"오류가 발생 Activity효과적이다 finished.

AFAIK에는 두 가지 옵션이 있습니다.

  1. 당신의 경고의 로그인을 재고 : 전화 dismiss()상의를 dialog실제로 활동을 종료하기 전에.
  2. dialog다른 스레드 thread에 넣고 현재에서 독립적으로 실행하십시오 activity.

5

AlertDialog 를 닫고 싶지만 참조를 유지하고 싶지 않은 경우의 해결책입니다. 활동 내 를 입니다.

솔루션에는 androidx.lifecycle 이 필요합니다. 프로젝트에 종속성 (의견이있는 순간 일반적인 요구 사항이라고 생각합니다)

이를 통해 대화 상자 해제를 외부 객체 (관찰자)에 위임 할 수 있으며 활동이 종료되면 자동으로 구독 취소되므로 더 이상 신경 쓰지 않아도됩니다. (여기에 증명이 있습니다 : https://github.com/googlecodelabs/android-lifecycles/issues/5 )입니다.

따라서 관찰자는 대화에 대한 참조를 유지하고 활동은 관찰자에 대한 참조를 유지합니다. "onPause"가 발생하면 관찰자가 대화 상자를 닫고 "onDestroy"가 발생하면 활동이 관찰자를 제거하므로 누출이 발생하지 않습니다 (적어도 적어도 logcat에 오류가 표시되지 않습니다)

// observer
class DialogDismissLifecycleObserver( private var dialog: AlertDialog? ) : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        dialog?.dismiss()
        dialog = null
    }
}
// activity code
private fun showDialog() {
        if( isDestroyed || isFinishing ) return
        val dialog = AlertDialog
            .Builder(this, R.style.DialogTheme)
            // dialog setup skipped
            .create()
        lifecycle.addObserver( DialogDismissLifecycleObserver( dialog ) )
        dialog.show()
}

4

윈도우 누수 예외에는 두 가지 이유가 있습니다.

1) 활동 컨텍스트가 존재하지 않을 때 대화 상자를 표시하십시오.이를 해결하려면 활동이 존재한다는 대화 상자 만 표시해야합니다.

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2)이 코드 사용을 해결하기 위해 대화 상자를 적절하게 닫지 마십시오.

@Override
public void onDestroy(){
    super.onDestroy();
    if ( Dialog!=null && Dialog.isShowing() ){
        Dialog.dismiss();
}
}

4

당신은 방법으로 Progressdialog물건 을 만들어야 하고 onPreExecute방법으로 AsyncTask해야 dismiss합니다 onPostExecute.


4

최상의 해결책은 예외가 발생할 때 try catch 및 dismiss 대화 상자에 대화 상자를 추가하는 것입니다.

아래 코드를 사용하십시오.

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }

3
완료 후 호출 대화 상자가 null되지 않습니다?, dialog.dismiss()
나도

3

필자의 경우 Android 매니페스트 파일에 권한을 포함하는 것을 잊었 기 때문입니다.

어떻게 알았습니까? 글쎄, @Bobby가 허용 된 답변 아래의 의견에서 말한 것처럼 로그까지 더 스크롤하면 예외를 던진 첫 번째 이유 또는 이벤트가 표시됩니다. "원래 추가 된 활동이 창에 누출되었습니다"라는 메시지는 첫 번째 예외가 무엇이든 예외입니다.


3

아래 코드를 시도하면 진행 대화 상자를 닫을 때마다 작동하며 해당 인스턴스가 사용 가능한지 여부를 알 수 있습니다.

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

2

가장 좋은 해결책은 이것을 보여주기 전에 이것을 progressbar넣거나progressDialog

if (getApplicationContext().getWindow().getDecorView().isShown()) {

  //Show Your Progress Dialog

}

이것은 나를 위해 작동하지 않습니다. 나는 HTTP 호출의 응답 후 Dialog.show ()를 가지고 그 동안 내가 활동이 분리되는 화면을 회전 만이 갖고있는 것 같아요 경우로 isShown == Dialog.show ()와 다음 대화 상자이 체크에도 불구하고 충돌하기 전에 사실
Michał Ziobro

1

코드 어딘가에서 발생한 일부 예외로 인해 활동이 예기치 않게 종료되지 않도록하십시오. 일반적으로 활동이 doinBackground 메소드에서 강제 종료에 직면 한 후 asynctask가 onPostexecute 메소드로 리턴 될 때 비동기 태스크에서 발생합니다.


1

나는 이것에 대한 또 다른 해결책을 가지고 있으며 그것이 당신에게 유효한지 알고 싶습니다 : 선도적 인 솔루션 인 onDestroy에서 기각하는 대신 ProgressDialog를 확장하고 있습니다 ...

public class MyProgressDialog extends ProgressDialog {

  private boolean isDismissed;

  public MyProgressDialog(Context context) {
    super(context);
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    dismiss();
  }

  @Override
  public void dismiss() {
    if (isDismissed) {
      return;
    }
    try {
      super.dismiss();
    } catch (IllegalArgumentException e) {
      // ignore
    }
    isDismissed = true;
  }

진행 상황 대화 상자를 회원으로 보유 할 필요가없고, 그냥 실행 (show)하고 잊어 버리기 때문에 AFAIC이 바람직합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.