android.view.WindowLeaked异常

时间:2014-07-03 05:19:38

标签: android xml-parsing android-asynctask progressdialog

我正在从网址中读取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(); 
                }   
        } 

}

4 个答案:

答案 0 :(得分:21)

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

有两种方法可以解决这种情况: -

方法1
因此,您需要在dismissonStop方法中onDestroy对话。例如:

@Override
protected void onStop() {
    super.onStop();

    if(pd!= null)
        pd.dismiss();
}

并在活动类

中定义对话框
ProgressDialog pd;

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

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

android:configChanges="orientation"

所以它看起来像

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

问题是当配置发生变化时,系统会破坏活动。请参阅ConfigurationChanges

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

答案 1 :(得分:1)

您在退出活动后尝试显示对话框。

解决方法是在退出Activity之前在Example.java:183中创建的Dialog上调用dismiss(),例如:在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
} 
}

答案 2 :(得分:1)

对话框是属于主线程的子对象,如果要显示或终止它们,则必须在OnUiThread上执行此操作。我正在使用片段,当我显示对话框时,获取此异常。但这种方法救了我。

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

答案 3 :(得分:0)

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