Android - 当设备处于横向时,ProgressDialog上的窗口泄漏错误

时间:2015-03-28 11:08:56

标签: android progressdialog android-orientation

我在这里查看了很多问题,并在互联网上搜索过,但无法找到任何具体的解决方案。其他问题所指的主要问题是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;
    }
}

任何建议或解决方案都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

问题在于我的代码,我使用了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

因为,根据Kevin Gaudinthis 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);
}