我正在反思我在本文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();
}
}
}
为什么将视图作用于活动?假设我们没有设定范围。演示者保留该视图。活动完成后,将无法访问演示者,因此有资格进行垃圾回收。传递视图引用也可以进行垃圾回收,对吧?
为什么将主持人限制在活动范围内?假设我们没有设定范围。该活动为每个活动实例创建一个新的演示者(每次您首次进入活动或旋转屏幕时)。活动结束后,将无法访问演示者,因此有资格进行垃圾回收。
使视图和演示者不受监管有什么害处?我有办法测试范围界定与取消范围界定的好处吗?
答案 0 :(得分:0)
此答案可能并不完美。但可以帮助您了解更多信息。
-here是对象可以进行垃圾回收的时间。
-如果我们不限制活动和演示者的范围。我们可能会以死锁结束垃圾回收。活动中包含对演示者的引用,而演示者中包含活动的引用。
-我在那看到的两个主要问题
1.上下文泄漏
2.内存不足(罕见的情况)
1)
当上下文泄漏发生时,活动结束,并且您想要对该活动进行一些更新。(当您不释放演示者时)。
假设活动完成后调用SimpleObserver的onNext。
它将发生错误。
因此,您需要释放活动的引用。(只需在onDestroy方法中分配null。)
2)
活动和演示者彼此保持引用,直到应用程序被杀死,它才不会被垃圾回收。这样您可能会耗尽内存。