Исключение android.view.WindowLeaked

Я читаю xml данные из URL-адреса. Он работал хорошо, когда это был портретный режим. Но я хотел изменить его в ландшафтном режиме. Но он получает исключение android.view.WindowLeaked.

Пожалуйста, помогите мне с этим. Заранее спасибо. Это мой код.

package com.eisuru.abc; import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.app.ProgressDialog; import android.content.pm.ActivityInfo; import android.view.Menu; import android.widget.TextView; public class MainActivity extends Activity { TextView tvResponse; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); tvResponse = (TextView) findViewById(R.id.tvResponse); new PostAsync().execute(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } class PostAsync extends AsyncTask<Void, Void, Void> { ProgressDialog pd; XMLHelper helper; @Override protected void onPreExecute() { pd = ProgressDialog.show(MainActivity.this, "Exchange Rates", "Loading Exchange rates values ...", true, false); } @Override protected Void doInBackground(Void... arg0) { helper = new XMLHelper(); helper.get(); return null; } @Override protected void onPostExecute(Void result) { StringBuilder builder = new StringBuilder(); for(Exrate_values post : helper.exrates) { builder.append("\n\t " + post.getDate()); builder.append("\t \t\t " + post.getFrom_currency()); builder.append("\t \t\t " + post.getTo_Currency()); builder.append("\t \t\t " + post.getExrt_buy()); builder.append("\t \t\t\t " + post.getExrt_sell()); builder.append("\n"); } tvResponse.setText(builder.toString()); pd.dismiss(); } } } 

Solutions Collecting From Web of "Исключение android.view.WindowLeaked"

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

Существует два способа справиться с этой ситуацией:

Способ 1
Поэтому вам нужно onStop onDestroy методе onStop или onDestroy . Например:

 @Override protected void onStop() { super.onStop(); if(pd!= null) pd.dismiss(); } 

И определить диалог в классе активности

 ProgressDialog pd; 

Эта ссылка поможет вам обрабатывать диалоги прогресса и изменения ориентации

Способ 2
Вы должны добавить это в объявление активности в манифесте:

 android:configChanges="orientation" 

Так выглядит

 <activity android:label="@string/app_name" android:configChanges="orientation|keyboardHidden" android:name="com.eisuru.abc.MainActivity"> 

Дело в том, что система разрушает действие, когда происходит изменение конфигурации. См. ConfigurationChanges .

Поэтому включение в конфигурационный файл позволяет избежать разрушения вашей системы. Вместо этого он вызывает метод onConfigurationChanged(Configuration) .

Вы пытаетесь показать диалог после выхода из Activity.

Решение заключается в вызове функции увольнения () в диалоговом окне, созданном в Example.java:183, перед тем как выйти из Activity, например, в onPause (). Перед открытием операции все окна и диалоги должны быть закрыты.

Или

Добавьте это в свой манифест:

 android:configChanges="orientation|keyboardHidden 

Затем в вашей деятельности добавьте это где-нибудь:

  @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); //ur Code } if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); //ur Code } } 

Диалог – это ребенок, который принадлежит к основному потоку, и если вы хотите показать или убить их, вы должны сделать это на OnUiThread, как это. Я использую фрагмент, и когда я показываю диалог, получаю это исключение. Но этот метод спасет меня.

  getActivity().runOnUiThread(new Runnable() { @Override public void run() { pDialog.show();//dismiss any dialog like this } }); 

Я получил эту ошибку, потому что я добавлял представление в onResume () всех моих действий с помощью WindowManager.addView (). Чтобы решить проблему, мне пришлось вызвать WindowManager.removeView () в onPause () всех моих действий.