从主要 activity 中提取可重用自定义按钮侦听器的最佳方法?

Best way to abstract reusable custom button listeners out of the main activity?

所以我的 Android 应用程序中的 Main activity 大约有 500 行,还有一些变化。我正在重构它并尽可能多地抽象出组件。占用大量 space 的组件之一是我的各种自定义按钮及其侦听器。我想将这些(当前嵌套 classes)放入单独的文件中并抽象组件,以便更容易集成到其他片段等中。这与使用侦听器接口并在每个中实现它们的常见实现相反activity/fragment.

我遇到的第一个明显问题是与 activity/fragment 通信,其中定义了 class 实例以更新成员变量。例如,我的按钮递增和递减一个数字,我需要在相应的父上下文中更新该数字。

我的第一个想法是我需要某种(弱)引用 activity/fragment。如果我打算与片段交互,那么在那种情况下,我必须将另一个标识参数存储到我的构造函数中,并稍后通过父 activity.

访问片段实例

我的第二个想法是改为通过外部 ViewModel 处理数据更新。然而,我对此主要担心的是,这个中间层(以及由此产生的 observable)对于快速更新功能来说太慢了,比如加速 increment/decrement 动作的按住按钮(这里没有提到) ,但在另一个线程中处理)。

这是我认为此设置的示例(至少对于上面的选项 1):

public class MainActivity extends AppCompatActivity {
  private int myData;
  Button inc;
  Button dec;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    inc = findViewById(R.id.inc);
    dec = findViewById(R.id.dec);

    CustomListener myListener = new CustomListener(getContext());

    inc.setOnClickListener(myListener);
    dec.setOnClickListener(myListener);
  }

  public incrementData() { myData++; }
  public decrementData() { myData--; }
}
public class CustomListener implements View.OnClickListener {
  private static WeakReference<MainActivity> activity;

  public CustomListener(Activity activity) {
    this.activity = new WeakReference<MainActivity>(activity);
  }

  @Override
  public void onClick(View view) {
    // If a Fragment was intended here, I'll have to somehow find this out via another
    // parameter, then grab the Fragment and use it here instead of the root activity 
    if (view.getId() == R.id.increment) activity.increment();
    else context.decrement();
  }
}

其他人在这种情况下会怎么做?将自定义按钮和自定义侦听器与 Activity 分开的“行业标准”是什么?我正在努力使我的个人项目的代码库干净整洁。

我最终从我的问题中选择了第二个想法。那就是我创建了一个ViewModel来更新监听器的数据,然后观察Activity/Fragment可以在更新时获取数据。

就与 ViewModel 交互而言,我将包含 activity/Fragment 的 this 上下文作为参数传递给了我的 class,因此我可以在定义 ViewModelStoreOwner 属性 的 ViewModelProvider.

它似乎工作得非常有效,并且完全没有 UI 快速重复更新模型的延迟。