我一直在研究Android的MVP,并从不同的站点阅读有关不将活动作为参数传递给演示者的信息,因为这是一种反模式,但是我遇到了一个问题,我需要使用第三方方法需要活动/上下文。
我曾经考虑过使用依赖注入,进行另一种抽象或仅将其传递给需要它的方法,而不是传递给构造函数,但我对更好的方法感到困惑。
科特林(演示者)中的一个例子
fun Food(*should activity be passed here?*) {
var bar = Foo(activity).build
Stand(bar, callback{})
}
如果有人能对此有所启发,那就太好了。
答案 0 :(得分:0)
我认为您应该避免将Activity Context传递给Presenter的任何明显原因。听说您应该使主持人独立于任何Android程序包,因为您可以将其重用于桌面/电视或其他平台,但是我认为这不起作用。
如果您需要在演示者中进行活动,则可以通过多种方法进行 (我的DI盒将使用Dagger2库,但您可以看看另一个):
只需通过setter / constructor中的活动,以使其更安全地使用WeakReference。这就是我们在项目中执行的操作。
公共类BasePresenter实现IPresenter {
protected VIEW view;
private WeakReference<FragmentActivity> activityWeakReference = new WeakReference<>(null);
@Override
public void onStart(FragmentActivity activity) {
activityWeakReference = new WeakReference<>(activity);
}
@Override
public void onStop() {
activityWeakReference.clear();
}
@Override
public void onViewCreated(Bundle savedInstanceState) {
}
public Optional<FragmentActivity> getActivity() {
return Optional.ofNullable(activityWeakReference.get());
}
public void getActivity(Action1<FragmentActivity> action) {
getActivity().ifPresent(action::call);
}
@Override
public void setView(VIEW view) {
this.view = view;
}
@Override
public boolean onBackPressed() {
return false;
}
@Override
public void navigationButtonClick() {
getActivity(Activity::finish);
}
@Override
public boolean onCustomActivityResult(int requestCode, int resultCode, Intent data) {
return false;
}}
当不再需要演示者时,不要忘记取消您的活动,因为它们的内存很大,因此会导致泄漏。
答案 1 :(得分:0)
如果您想以一种“干净的方式”工作,则应始终将框架(android,第三方库,数据源...)推送到体系结构的外层(尽可能远离业务逻辑)
在您的情况下,我将为第三方库和上下文创建一个“包装器类”,然后将此类的接口作为演示者的构造函数参数注入。 这样,您的演示者就可以保持干净,并且不必更改第三方库。
在这里您可以阅读有关干净架构的更多信息:
https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html
https://github.com/android10/Android-CleanArchitecture
https://android.jlelse.eu/a-complete-idiots-guide-to-clean-architecture-2422f428946f