Android MVP: safe use Context in Presenter

前端 未结 4 832
悲&欢浪女
悲&欢浪女 2021-01-17 10:02

In my app I work with ContentProvider and use LoaderManager.LoaderCallbacks.

Fragment (View)



        
4条回答
  •  半阙折子戏
    2021-01-17 10:23

    Code like this

    Loader loader = new ArticleCatalogLoader(context, categoryId);
    

    leads to untestable code. You should avoid creating "business" objects in your code and let anyone else do it for you (any DI framework such as Dagger 2 would be a better option than handling it yourself)

    Having said that, your problem is something that DI has solved a long time ago. Do you need a fresh new instance of any object? Use a Provider

    A Provider is an object that "provides" instances of objects. So instead of having

    Loader loader = new ArticleCatalogLoader(context, categoryId);
    

    you will have

    Loader loader = loaderProvider.get(categoryId);
    

    So the only thing you need is something like this:

    public class ArticleCatalogPresenter ... {
        ...
        private final Provider loaderProvider;
    
        public ArticleCatalogPresenter(Provider loaderProvider, ...) {
            this.loaderProvider = loaderProvider;
            ...
        }
    
        private Loader onCreateArticleCatalogLoader(Bundle args) {    
            int categoryId = args.getInt(CATEGORY_ID);
            Loader loader = loaderProvider.get(categoryId); // no context needed anymore!
            return loader;
        }
    
    }
    

提交回复
热议问题