我正在从网址中读取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();
}
}
}
答案 0 :(得分:21)
当一个活动的对话框设置为可见但在方向改变时,活动本身被破坏,然后它会导致泄露的窗口错误。
有两种方法可以解决这种情况: -
方法1
因此,您需要在dismiss
或onStop
方法中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()。