Проблемы с утечкой памяти во фрагменте - PullRequest
0 голосов
/ 03 июля 2018

Я реализовал шаблон MVP в своем приложении. И я использую WeakReferences для хранения ссылки View в моем Presenter. Но все же мои фрагменты не требуются GC после уничтожения. Ниже приведен скриншот проблемы. Любая идея, что вызывает это и как устранить эту проблему?

Screenshot of Android Profiler

Ниже приведен код моего докладчика:

public class ProductDetailPresenter implements ProductDetailContract.Presenter {

private final WeakReference<ProductDetailContract.View> view;
private CategoriesDataSource repo;

public ProductDetailPresenter(ProductDetailContract.View view, CategoriesDataSource repo) {
    this.view = new WeakReference<>(view);
    this.repo = repo;
    view.setPresenter(this);
}

@Override
public void start() {

}

@Override
public void submitRating(final Product product, final float mRating) {
    final ProductDetailContract.View view =ProductDetailPresenter.this.view.get();

    if (view != null) {
        repo.submitRating(product.getId(), mRating, true, new CategoriesDataSource.SubmitRatingCallback() {

            @Override
            public void onRatingSubmitted() {

                product.setRating(mRating);
                product.setRated(true);
                product.setUpdatedAt(new Date(System.currentTimeMillis()));
                repo.updateProductInDB(product);

                if (!view.isActive()) return;

                view.onRatingSubmitted(true, mRating);
            }

            @Override
            public void onError(Throwable throwable) {
                if (!view.isActive()) return;

                view.onRatingSubmitted(false, 0);
            }
        });
    }
}

@Override
public void onRateKarenClicked() {
    ProductDetailContract.View view = this.view.get();
    if (view != null) {
        view.openDialog();
    }
}

@Override
public void onAbhiKhareediyeClicked(Product product) {

    EventBus.getDefault().post(
            new ProductDetailContract.ContractEventMessages(
                    ProductDetailContract.ContractEventMessages.EVENT_START_QUANTITY_SCREEN, product));

}

}

1 Ответ

0 голосов
/ 03 июля 2018

Это проблема:

    @Override
    public void submitRating(final Product product, final float mRating) {
       final ProductDetailContract.View view =ProductDetailPresenter.this.view.get(); <-- this is bad

у вас есть последний объект, который передается в репо. Удалить всю строку. Тебе это не нужно. Используйте в view.get () внутри onRatingSubmitted и onError

...