首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >android.view.WindowLeaked异常

android.view.WindowLeaked异常
EN

Stack Overflow用户
提问于 2014-07-03 05:19:37
回答 4查看 12.9K关注 0票数 8

我正在从url中读取xml数据。当它是肖像模式时,它工作得很好。但我想把它变成景观模式。但是它得到了android.view.WindowLeaked异常。

请帮我处理这个。提前谢谢。这是我的密码。

代码语言:javascript
代码运行次数:0
运行
复制
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(); 
                }   
        } 

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-03 05:25:04

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

处理这种情况的方法有两种:

方法1

因此,您需要在activity的onStoponDestroy方法中使用onDestroy对话框。例如:

代码语言:javascript
代码运行次数:0
运行
复制
@Override
protected void onStop() {
    super.onStop();

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

并在活动类中定义对话框。

代码语言:javascript
代码运行次数:0
运行
复制
ProgressDialog pd;

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

方法2

您必须将其添加到清单中的活动声明中:

代码语言:javascript
代码运行次数:0
运行
复制
android:configChanges="orientation"

所以看起来

代码语言:javascript
代码运行次数:0
运行
复制
<activity android:label="@string/app_name" 
        android:configChanges="orientation|keyboardHidden" 
        android:name="com.eisuru.abc.MainActivity">

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

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

票数 21
EN

Stack Overflow用户

发布于 2014-07-03 05:46:16

退出某个活动后,您正在尝试显示对话框。

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

将此添加到您的清单中:

代码语言:javascript
代码运行次数:0
运行
复制
android:configChanges="orientation|keyboardHidden

然后在您的活动中添加以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
 @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
} 
}
票数 1
EN

Stack Overflow用户

发布于 2015-07-13 13:31:25

对话框是属于主线程的子线程,如果要显示或杀死它们,必须在OnUiThread上这样做。我使用片段,当我显示对话框时,得到这个异常。但这个方法救了我。

代码语言:javascript
代码运行次数:0
运行
复制
 getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            pDialog.show();//dismiss any dialog like this
        }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24545471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档