【问题标题】:android.view.WindowLeaked exceptionandroid.view.WindowLeaked 异常
【发布时间】:2014-08-24 02:11:50
【问题描述】:

我正在从 url 读取 xml 数据。当它是肖像模式时效果很好。但我想将其更改为横向模式。但它得到 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(); 
                }   
        } 

}

【问题讨论】:

    标签: android xml-parsing android-asynctask progressdialog


    【解决方案1】:

    当活动上的对话框设置为可见但方向改变时活动本身被破坏,然后它会导致泄漏窗口错误。

    有两种方法可以处理这种情况:-

    方法一
    因此,您需要在活动的onStoponDestroy 方法中dismiss 对话框。例如:

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

    并在活动类中定义对话框

    ProgressDialog pd;
    

    此链接将帮助您Handling progress dialogs and orientation changes

    方法二
    您必须将此添加到清单中的活动声明中:

    android:configChanges="orientation"
    

    看起来像

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

    问题在于,当配置发生更改时,系统会破坏活动。见ConfigurationChanges

    因此,将其放入配置文件可避免系统破坏您的活动。相反,它调用onConfigurationChanged(Configuration) 方法。

    【讨论】:

    • 非常感谢您的有用评论。我做了第二种方法。它工作得很好。 android:screenOrientation="landscape"android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"&gt;
    • @Isuru 乐于助人,享受编码。
    • 方法 1 非常适合我。有趣的旁注:当我最初遇到窗口泄漏时,我已经在清单的 configChanges 中声明了方向。
    • 方法 1 完美运行,我肯定更喜欢它而不是弄乱清单文件。
    • 请检查您的链接“处理进度对话框和方向更改”。链接页面仅显示广告。
    【解决方案2】:

    您试图在退出 Activity 后显示一个对话框。

    解决方案是在退出 Activity 之前在您在 Example.java:183 中创建的 Dialog 上调用 dismiss(),例如在 onPause() 中。在离开 Activity 之前,应关闭所有窗口和对话框。

    或者

    将此添加到您的清单中:

    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
    } 
    }
    

    【讨论】:

      【解决方案3】:

      dialog 是一个属于主线程的子线程,如果你想显示或杀死它们,你必须像这样在 OnUiThread 上执行此操作。我正在使用片段,当我显示对话框时,得到这个异常。但是这个方法救了我。

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

      【讨论】:

      • 您能否编辑您的答案并解释如何解决问题?
      【解决方案4】:

      我收到此错误是因为我使用 WindowManager.addView() 在所有活动的 onResume() 中添加了一个视图。为了解决这个问题,我必须在所有活动的 onPause() 中调用 WindowManager.removeView()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 2018-04-09
        • 1970-01-01
        • 2018-06-15
        相关资源
        最近更新 更多