Можно ли передать экземпляр действия в класс? - PullRequest
0 голосов
/ 14 мая 2018

Есть сценарий, в котором мне нужно передать активность и ее кнопку в Java-класс.

Я сделал следующее, и он работает нормально, меня интересует только правильный ли способ интегрировать это.

MainActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    button= findViewById(R.id.btn);

    UIComponents uiComponents= new UIComponents();
    uiComponents.setActivity(this, button);

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    Log.d("result", String.valueOf(requestCode));
}

UIComponents.class

public class UIComponents {

    public void setActivity(final AppCompatActivity activity, Button btn){

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent= new Intent(activity, ResultActivity.class);
               activity.startActivityForResult(intent, 999);
            }
        });

    }

Это прекрасно работает, отображается toastсообщение на экране моей активности, также я могу получить onActivityResult обратный вызов моей активности.Меня беспокоит, может ли это привести к проблемам с производительностью.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Самая важная вещь, которую необходимо учитывать, это жизненный цикл ваших компонентов.В общем, вы не должны передавать ссылку на действие какому-либо объекту, который мог бы пережить его.Теоретически (вероятно, очень далеко), ваша активность может быть прервана между моментом, когда пользователь нажимает кнопку, и временем выполнения OnClickListener (если он еще не был собран мусором), и вы получите NullPointerException,Кроме того, вы можете передать (даже случайно) UIComponents другому объекту с другим жизненным циклом.

В этом случае рекомендуется использовать архитектуру MVP .Конкретный случай обработки нажатий кнопок описан здесь среди других мест.

Кроме того, следуя « Руководству по архитектуре приложения » от Google, вероятно, хорошая идея.

0 голосов
/ 14 мая 2018

Вы можете просто передать только кнопку и использовать доступный метод getContext, например,

public class UIComponents {

public void setActivity(Button btn){
    Context activity = btn.getContext();
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent= new Intent(activity, ResultActivity.class);
           activity.startActivityForResult(intent, 999);
        }
    });

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...