Как воссоздать/перезапустить приложение при изменении языка приложения Android?

Я создал приложение, которое запрашивает предпочтительный язык пользователя в Loginfragment. Мне нужно убить и перезапустить приложение после установки языка. Я попытался использовать воссоздание, но это приводит к следующей ошибке

android.view.WindowLeaked: Activity xxx.presentation.activity.MainActivity has leaked window DecorView@aea6bb8[MainActivity] that was originally added here

Мой LoginFragment выглядит следующим образом:

public class LoginFragment extends Fragment implements View.OnClickListener,LoginView{

//Some code

private void setListeners(View view) {

//Some code
view.findViewById(R.id.change_lang_btn).setOnClickListener(this);
    }

@Override
    public void onClick(View v){
        switch(v.getId()){
            case R.id.change_lang_btn:
                Log.v("LOGIN","Change Language button clicked");
                GeneralUtils.setupAppLanguageDialog(getActivity());
                getActivity().recreate();  //Creates memory leak
                break;
        }
    }

Мой класс GeneralUtils, который содержит диалоговое окно смены языка, выглядит так:

public class GeneralUtils {

//Some code

public static void setupAppLanguageDialog(Context context)
    {
        AlertDialog langChangeDialog;
        CharSequence[] changeLangList = {"English", "हिन्दी"};
        AlertDialog.Builder mBuilder = new AlertDialog.Builder(context);
        mBuilder.setTitle("Choose language");
        mBuilder.setSingleChoiceItems(changeLangList, -1, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                if (i==0)
                {
                    DataRepository.setLocale("en", ((ContextWrapper)context).getBaseContext());

                }
                else
                {
                    DataRepository.setLocale("hi",((ContextWrapper)context).getBaseContext());
                }
                dialogInterface.dismiss();
                Toast.makeText(context, context.getString(R.string.Language_change_done),Toast.LENGTH_LONG).show();
            }
        });
        langChangeDialog =mBuilder.create();
        langChangeDialog.show();
}
    }

Функция SetLocale выполняет необходимые настройки и обновляет общие настройки для изменения языка. Как мне решить проблему с утечкой памяти, если я воссоздаю приложение? В чем причина? Есть ли лучший подход? Приветствуются любые предложения по созданию/улучшению функциональности.

Изменить: я проверил соответствующий ответ на наличие утечек памяти, но Мне нужно понять, как использовать его в моем сценарии.


person segfault404    schedule 27.07.2020    source источник
comment
Вы пытались удалить представления из диалогового интерфейса? Возможно, экземпляр этого диалога может быть причиной утечки!   -  person hamza khan    schedule 28.07.2020
comment
Или вместо контекста активности попробуйте applicationContext   -  person hamza khan    schedule 28.07.2020