Завершить работу из пользовательского представления с использованием контекста

Вот мой код:

private void makeDialog2() { AlertDialog.Builder about = new AlertDialog.Builder(getContext()); about.setTitle("You Won!"); about.setPositiveButton("Play Again", new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { Intent playIntent2 = new Intent(getContext(), PracticePlayActivity.class); playIntent2.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); getContext().startActivity(playIntent2); ((Activity) getContext()).finish(); } }); about.setNegativeButton("Exit", new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg1, int arg2) { Intent playIntent = new Intent(getContext(), PlayChooserActivity.class); playIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); getContext().startActivity(playIntent); ((Activity) getContext()).finish(); } }); about.show(); } 

Этот код запрашивается, когда пользователь проигрывает игру и хочет повторить попытку. Однако, когда я нажимаю повторную попытку, более чем в 4 раза сбой приложения. Я подозреваю утечку памяти. После некоторого тестирования в logcat мне удалось выяснить, что действие все еще выполняется после повторной попытки.

Мой план состоит в том, чтобы атаковать эту проблему двумя вещами. Утилизация моих чертежей и завершение первого действия в целом. Однако первое действие не закрывается даже после завершения вызова. Любая помощь? (Использование getContext () в других частях моего кода работает до сих пор).

EDIT: Завершая работу, он автоматически уничтожает переменные? Или мне все еще нужно очистить растровые изображения из памяти Android? Любые идеи, как я могу это сделать?

Если makeDialog2() объявляется внутри Activity попробуйте использовать this или YourActivityName.this вместо getContext() . Если это не так, попробуйте передать Context методу в качестве параметра с помощью this или YourActivityName.this откуда вы вызываете метод.

По окончании действия он автоматически уничтожает переменные?

Завершение Activity должно уничтожить ее и все связанные ресурсы. Если позже вы запустите новый экземпляр Activity он заново создаст все его ресурсы. Если вы не используете какие-то статические переменные, они останутся «живыми», пока ваше приложение работает.


Место, откуда этот метод вызывается, на самом деле является видом поверхности, поэтому любой параметр, который я ему даю, по-прежнему будет getContext (). Есть ли способ обойти это? Я не понимаю, почему ((Activity) getContext ()). Finish (); Не работает

Взгляните на документацию для класса Activity .

Как вы видите, Context – это суперкласс класса Activity означающий, что каждое действие является Context но не каждый Context – это Activity . Другими словами ((Activity) getContext()).finish(); Может вызвать ClassCastException .

То, что вы могли бы сделать, чтобы убедиться, что Context вы получаете, на самом деле также является Activity , выполняет такую ​​проверку:

 if( getContext() instanceof Activity ) Log.e( "TAG", "getContext() returns an Activity!" ); 

Добавьте это прямо перед вызовом finish() и проверьте, согласен ли LogCat с его Activity .

Я решил это. Возможно, это ошибка, но мне пришлось сначала вызвать имя класса до функции getContext (). Возможно, это ошибка с функцией диалога или ошибкой в ​​моей структуре кода.

 ClassName.this.getContext() 

Мне удалось найти решение этой проблемы и избежать исключения ClassCastException.

Сначала переопределите метод getApplicationContext () в своей деятельности, чтобы он возвращал текущий экземпляр

 @Override public Context getApplicationContext() { return this; } 

Этот метод все равно вернет экземпляр с типом ссылочного типа Context, но теперь вы можете передать его в YourActivity, прежде чем передавать его на свое собственное представление.

  new CustomView((YourActivity) getApplicationContext()); 

Кроме того, убедитесь, что вы ссылаетесь на это с помощью функции « YourActivity вместо « Context в своем пользовательском представлении.

Надеюсь, что этот пост помогает кому-то еще, кто сталкивается с этим 🙂