I'm reading xml data from a url. It worked well when it was it portrait mode. But I wanted to change it to landscape mode. But it gets android.view.WindowLeaked exception.
Please help me with this. Thanks in advance. This is my code.
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();
}
}
}
When a dialog on an activity is set to visible but on orientation changes the activity itself is destroyed, then it causes leaked window error.
There are two methods to handle this situation:-
Method 1
Therefore,you need to dismiss
dialog in activity's onStop
or onDestroy
method. For example:
@Override
protected void onStop() {
super.onStop();
if(pd!= null)
pd.dismiss();
}
and define dialog in activity class
ProgressDialog pd;
This link will help you Handling progress dialogs and orientation changes
Method 2
You have to add this to the activity declaration in the manifest:
android:configChanges="orientation"
so it looks like
<activity android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden"
android:name="com.eisuru.abc.MainActivity">
The matter is that the system destroys the activity when a change in the configuration occurs. See ConfigurationChanges.
So putting that in the configuration file avoids the system to destroy your activity. Instead it invokes the onConfigurationChanged(Configuration)
method.