将活动实例传递给类是否可以?

时间:2018-05-14 11:25:50

标签: android performance android-layout

有一种情况我需要将活动及其按钮传递给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 :(得分:1)

你只能传递Button并使用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);
        }
    });

}

答案 1 :(得分:1)

这里要考虑的最重要的事情是组件的生命周期。通常,您不应该将对活动的引用传递给任何可能比它活跃的对象。从理论上讲(可能非常后方),您的活动可能会在用户单击按钮和OnClickListener(如果尚未收集垃圾)的时间之间被杀死,并且您可以执行此操作。得到一个NullPointerException。此外,您可能会(甚至意外地)将UIComponents传递给具有不同生命周期的其他对象。

在这种情况下的最佳做法通常是使用MVP架构。处理按钮点击的具体情况在其他地方描述here

此外,遵循" Guide to App Architecture"谷歌可能是一个好主意。