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

问题描述 投票:0回答:1

我正在思考我在本文中读到的一些代码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();
}

splash activity module.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);
    }

splash activity presenter.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. 为什么将演示者的范围扩展到活动?假设我们没有范围。活动为每个活动实例创建一个新的演示者(每次首次进入活动或旋转屏幕时)。活动完成后,无法访问演示者,因此可以进行垃圾回收。

离开视图和演示者未受约束的危害是什么?有没有办法让我测试范围界定对未取消的好处?

android mvp
1个回答
0
投票

这个答案可能并不完美。但它可以帮助您了解更多。 -here是指对象符合垃圾回收的条件。 - 如果我们没有范围活动和演示者。我们可能会以垃圾收集的死锁结束。其中,活动持有对演示者的引用,演示者持有活动参考。 - 我看到的两个主要问题 1.上下文泄漏 2.记忆力不足(罕见情况) 1)当上下文泄漏发生时,活动结束,并且您想要对该活动进行更新。(当您不释放演示者时)。 假设在活动结束后调用SimpleObserver的onNext。它会遇到错误。所以你需要如何释放活动的引用。(只需在方法onDestroy中指定null。) 2)活动和主持人互相引用它将永远不会被垃圾收集,直到申请被杀死。所以你可能会耗尽内存。

© www.soinside.com 2019 - 2024. All rights reserved.