为什么我们在MVP中定义视图和演示者的范围

时间:2019-03-26 13:02:38

标签: android mvp

我正在反思我在本文https://github.com/frogermcs/GithubClient/tree/1bf53a2a36c8a85435e877847b987395e482ab4a中阅读的一些代码

BaseActivity.java:

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setupActivityComponent();
    }

    protected abstract void setupActivityComponent();
}

SplashActivityModule.java:

@Module
public class SplashActivityModule {
    private SplashActivity splashActivity;

    public SplashActivityModule(SplashActivity splashActivity) {
        this.splashActivity = splashActivity;
    }

    @Provides
    @ActivityScope
    SplashActivity provideSplashActivity() {
        return splashActivity;
    }

    @Provides
    @ActivityScope
    SplashActivityPresenter
    provideSplashActivityPresenter(Validator validator, UserManager 
    userManager, HeavyLibraryWrapper heavyLibraryWrapper) {
        return new SplashActivityPresenter(splashActivity, validator, 
                                           userManager, heavyLibraryWrapper);
    }
}

将SplashActivityPresenter注入SplashActivity.java中:

public class SplashActivity extends BaseActivity {
    ...

    @Inject
    SplashActivityPresenter presenter;

    @Override
    protected void setupActivityComponent() {
        GithubClientApplication.get(this)
                .getAppComponent()
                .plus(new SplashActivityModule(this))
                .inject(this);
    }

SplashActivityPresenter.java:

public class SplashActivityPresenter {
    public String username;

    private SplashActivity splashActivity;
    private Validator validator;
    private UserManager userManager;
    private HeavyLibraryWrapper heavyLibraryWrapper;

    public SplashActivityPresenter(SplashActivity splashActivity, 
        Validator validator, UserManager userManager, 
        HeavyLibraryWrapper heavyLibraryWrapper) {
        this.splashActivity = splashActivity;
        this.validator = validator;
        this.userManager = userManager;
            this.heavyLibraryWrapper = heavyLibraryWrapper;

        //This calls should be delivered to ExternalLibrary right after it will be initialized
        this.heavyLibraryWrapper.callMethod();
        this.heavyLibraryWrapper.callMethod();
        this.heavyLibraryWrapper.callMethod();
        this.heavyLibraryWrapper.callMethod();
    }

    public void onShowRepositoriesClick() {
        if (validator.validUsername(username)) {
            splashActivity.showLoading(true);
            userManager.getUser(username).subscribe(new 
SimpleObserver<User>() {
                @Override
                public void onNext(User user) {
                    splashActivity.showLoading(false);
                    splashActivity.showRepositoriesListForUser(user);
                }

                @Override
                public void onError(Throwable e) {
                    splashActivity.showLoading(false);
                    splashActivity.showValidationError();
                }
            });
        } else {
            splashActivity.showValidationError();
        }
    }
}
  1. 为什么将视图作用于活动?假设我们没有设定范围。演示者保留该视图。活动完成后,将无法访问演示者,因此有资格进行垃圾回收。传递视图引用也可以进行垃圾回收,对吧?

  2. 为什么将主持人限制在活动范围内?假设我们没有设定范围。该活动为每个活动实例创建一个新的演示者(每次您首次进入活动或旋转屏幕时)。活动结束后,将无法访问演示者,因此有资格进行垃圾回收。

使视图和演示者不受监管有什么害处?我有办法测试范围界定与取消范围界定的好处吗?

1 个答案:

答案 0 :(得分:0)

此答案可能并不完美。但可以帮助您了解更多信息。
-here是对象可以进行垃圾回收的时间。
-如果我们不限制活动和演示者的范围。我们可能会以死锁结束垃圾回收。活动中包含对演示者的引用,而演示者中包含活动的引用。
-我在那看到的两个主要问题

1.上下文泄漏
2.内存不足(罕见的情况)
1) 当上下文泄漏发生时,活动结束,并且您想要对该活动进行一些更新。(当您不释放演示者时)。
假设活动完成后调用SimpleObserver的onNext。 它将发生错误。 因此,您需要释放活动的引用。(只需在onDestroy方法中分配null。)
2) 活动和演示者彼此保持引用,直到应用程序被杀死,它才不会被垃圾回收。这样您可能会耗尽内存。