我在这里查看了很多问题,并在互联网上搜索过,但无法找到任何具体的解决方案。其他问题所指的主要问题是Window Leak Error
从纵向到横向,反之亦然。答案主要是,因为Activity
被销毁并重新创建,因此Window Leak Error
。
但我的问题是,我的设备已经在横向,并且应用程序运行良好,之前的活动顺利运行,但是当我尝试显示ProgressDialog
时,Window Leak Error
被抛出。在纵向方向上,完全相同的代码可以正常工作。
class DownloadYearChartAsyncTask extends AsyncTask<String, Integer, Boolean>
{
private String username;
private String city;
private Resources resources;
private Location locationOfCity = null;
private ProgressDialog progressDialog;
public DownloadYearChartAsyncTask(String username)
{
this.username = username;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
resources = getResources();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
progressDialog = new ProgressDialog(CityActivity.this);
progressDialog.setTitle(R.string.title_progress_dialog);
progressDialog.setMessage(resources.getString(R.string.first_message_progress_dialog));
progressDialog.setIndeterminate(true);
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progressDialog.show();
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
progressDialog.dismiss();
boolean userUpdated = false;
if(locationOfCity != null && city != null && !city.isEmpty()) {
try
{
UserDAO userDAO = new UserDAO(CityActivity.this);
User user = userDAO.readUser();
if(user == null) {
if(username != null && !username.isEmpty()) {
user = new User(0, username, city, locationOfCity.getLatitude(), locationOfCity.getLongitude());
userUpdated = userDAO.createUser(user);
}
}
if(username == null) {
user.setLocation(city);
user.setLatitude(locationOfCity.getLatitude());
user.setLongitude(locationOfCity.getLongitude());
userUpdated = userDAO.updateUser(user);
}
}
userDAO.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
if(userUpdated)
{
Intent intent = new Intent(CityActivity.this, TodayActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
overridePendingTransition(R.anim.slide_in_from_right, R.anim.slide_out_to_left);
}
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);
}
@Override
protected Boolean doInBackground(String... params) {
boolean allDaysEntered = false;
try {
city = params[0];
locationOfCity = MyJsonUtil.getLocationOfCity(params);
List<Day> yearChart = MyJsonUtil.getYearChart(locationOfCity.getLatitude(), locationOfCity.getLongitude());
if(yearChart != null && !yearChart.isEmpty()) {
YearChartDAO yearChartDAO = new YearChartDAO(CityActivity.this);
allDaysEntered = yearChartDAO.createYearChartWithDays(yearChart);
yearChartDAO.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
return allDaysEntered;
}
}
任何建议或解决方案都将受到赞赏。
答案 0 :(得分:0)
问题在于我的代码,我使用了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
因为,根据Kevin Gaudin对this answer的评论。
看起来如果你打电话
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
当设备未处于默认方向使用时,则 活动方向立即更改(销毁和重新创建) 到设备默认方向。例如,在手机上,如果你 将其保持在横向方向,然后将活动切换到 重新激活传感器时,纵向和回到横向。相同 与Archos A5 IT相反的问题:在肖像中使用它导致了 要切换到风景并回到肖像的活动。
Here是我找到的解决方案,由CommonsWare回答。但这个解决方案有点冗长。
因此,对于那些匆忙的人来说,这是我使用的技术,但这种解决方案并不完美。
1 - 在Manifest
中,将android:configChanges="orientation|screenSize"
添加到您要在其中展示ProgressDialog
的活动中。
2 - 在Activity
中,只需覆盖OnConfigurationChange(Configuration newConfig)
:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}