Подтвердить что ты не робот

Мое приложение часто бросает android.view.WindowLeaked exception -

Мое приложение часто выдает исключение, как показано ниже:

E/WindowManager (6282): android.view.WindowLeaked: Activity com.myActivity просочилось окно [email protected], что был первоначально добавлен здесь

Приложение отображает диалог прогресса, когда начинается основное действие и запускается задача. Когда задача будет выполнена, она отклонит диалог выполнения.

Мой код выглядит следующим образом. Кто-нибудь может мне помочь?

public class MyActivity extends Activity {

private static int ID_DIALOG_PROGRESS = 2001;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.my_activity);
    showDialog(ID_DIALOG_PROGRESS);
    new MyTask().execute(null, null, null);
}

@Override
protected Dialog onCreateDialog(int id) {
    if (id == ID_DIALOG_PROGRESS) {
        ProgressDialog loadingDialog = new ProgressDialog(this);
        loadingDialog.setTitle("");
        loadingDialog.setMessage("");
        loadingDialog.setIndeterminate(true);
        loadingDialog.setCancelable(false);
        return loadingDialog;
    }

    return super.onCreateDialog(id);
}

private class MyTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... arg0) {

            /* Do something expensive here...*/

            /* Start other activity*/
            Intent intent = new Intent(MyActivity.this, OtherActivity.class);
            startActivityForResult(intent, 1000);
        }

        return null;
    }

    protected void onPostExecute(Void arg0) {
        dismissDialog(ID_DIALOG_PROGRESS);
    }
}
}

В большинстве случаев исключение было вызвано вызовом showDialog(). В другой раз это исключение было вызвано вызовом rejectDialog().

Заранее благодарю вас!

4b9b3361

Ответ 1

Вы начинаете новое действие в doInBackground() перед тем, как отклонить диалог в onPostExecute(), что, вероятно, вызывает утечку диалога. Я бы переехал

Intent intent = new Intent(MyActivity.this, OtherActivity.class);
startActivityForResult(intent, 1000);

до onPostExecute() после вызова dismissDialog() и посмотреть, что произойдет.

Ответ 2

Это также хорошая практика, чтобы попытаться... поймать

dismissDialog(ID_DIALOG_PROGRESS);

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