Hot项目进行部分修改(加入Dagger2)

最近在看Dagger2,网上资料也很多,并且在自己私下的项目中Hot运用(一个关于微信热门头条的分享)。这里就不介绍dagger的一些使用方法啊,这里有个很好的介绍dagger介绍

DataManager管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/**
* Created by wukewei on 16/7/12.
* 这个类是管理app的数据来源无论从网络获取.内存.还是磁盘
*/
public class DataManager {
private HotApi mHotApi;
private CacheLoader cacheLoader;
@Inject
public DataManager(HotApi hotApi, CacheLoader cacheLoader) {
this.mHotApi = hotApi;
this.cacheLoader = cacheLoader;
}
/***
* 获取分类的类型
* @param
* @param
* @return
*/
public List<String> getTabs() {
List<String> tabs = new ArrayList<>();
tabs.add("科技");
tabs.add("美女");
tabs.add("生活");
tabs.add("娱乐");
tabs.add("搞笑");
tabs.add("宅男");
return tabs;
}
/***
* 获取列表
* @param pn 页码
* @param type 类别名称
* @return
*/
public Observable<List<Popular>> getPopular(int pn, String type) {
return mHotApi.getPopular(pn, Constants.PAGE_SIZE, type)
.compose(SchedulersCompat.applyIoSchedulers())
.compose(RxResultHelper.handleResult())
.doOnNext(populars -> {
if (pn == 1) {
ListPopular popular = new ListPopular(populars);
cacheLoader.upNewData(type, popular);
}
});
}
/***
* 获取缓存信息 默认只缓存第一页
* @param type 类别名称
* @param
* @return
*/
public Observable<List<Popular>> getCachePopular(String type) {
NetworkCache<ListPopular> networkCache = new NetworkCache<ListPopular>() {
@Override
public Observable<ListPopular> get(String key, Class<ListPopular> cls) {
return mHotApi.getPopular(1, Constants.PAGE_SIZE, type)
.compose(SchedulersCompat.applyIoSchedulers())
.compose(RxResultHelper.handleResult())
.flatMap(populars -> {
ListPopular popular = new ListPopular(populars);
return Observable.just(popular);
});
}
};
return cacheLoader.asDataObservable(Constants.NEW_LIST + type, ListPopular.class, networkCache)
.map(listPopular -> listPopular.data);
}
}

AppModule的构造的对象和提供的依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**
* Created by wukewei on 16/7/19.
*/
@Module
public class AppModule {
private App application;
public AppModule(App application) {
this.application = application;
}
@Provides
@Singleton
@ContextLife("Application")
public App provideApp() {
return application;
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
Interceptor apikey = chain -> chain.proceed(chain.request().newBuilder()
.addHeader("apikey", Constants.Api_Key).build());
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(Constants.HTTP_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.connectTimeout(Constants.HTTP_CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.addInterceptor(apikey)
.addInterceptor(loggingInterceptor)
.build();
return okHttpClient;
}
@Provides
@Singleton
HotApi provideHotApi(OkHttpClient okHttpClient) {
Retrofit retrofit1 = new Retrofit.Builder()
.baseUrl(Constants.Base_Url)
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
HotApi hotApi = retrofit1.create(HotApi.class);
return hotApi;
}
@Provides
@Singleton
CacheLoader provideCacheLoader() {
return CacheLoader.getInstance(application);
}
@Provides
@Singleton
DataManager provideDataManager(HotApi hotApi, CacheLoader cacheLoader) {
return new DataManager(hotApi, cacheLoader);
}
}

接下来的Component的注入的代码

ActivityComponent的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Created by wukewei on 16/7/19.
*/
@PerActivity
@Component(dependencies = AppComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
DataManager getDataManager();
Activity getActivity();
void inject(MainActivity mainActivity);
void inject(WebActivity webActivity);
}

3.FragmentComponent的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* Created by wukewei on 16/7/19.
*/
@PerFragment
@Component(dependencies = AppComponent.class, modules = FragmentModule.class)
public interface FragmentComponent {
DataManager getDataManager();
Activity getActivity();
void inject(ItemFragment itemFragment);
}

之前在View 和P的关联在通过在p构造方法中传入,现在是使用调用p的attachView()方法。

现在BasePresenter设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* Created by wukewei on 16/5/26.
*/
public abstract class BasePresenter<T extends IView> implements IPresenter<T> {
protected Activity mActivity;
protected T mView;
protected CompositeSubscription mCompositeSubscription;
protected DataManager dataManager;
public BasePresenter(DataManager dataManager, Activity activity) {
this.dataManager = dataManager;
this.mActivity = activity;
}
@Override
public void attachView(T view) {
this.mView = view;
}
protected void handleError(Throwable throwable) {
ToastUtil.showShort(mActivity, ErrorHanding.handleError(throwable));
}
protected void unSubscribe() {
if (mCompositeSubscription != null) {
mCompositeSubscription.unsubscribe();
}
}
protected void addSubscribe(Subscription subscription) {
if (mCompositeSubscription == null) {
mCompositeSubscription = new CompositeSubscription();
}
mCompositeSubscription.add(subscription);
}
@Override
public void detachView() {
this.mView = null;
unSubscribe();
}
}

BaseActivity中的p之前需要自己new出来,现在加入了dagger2,通过注入的方式

/**

  • Created by wukewei on 16/5/26.
    */
    public abstract class BaseActivity extends AppCompatActivity implements IView {

    @Inject
    protected T mPresenter;
    protected Activity mContext;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(getLayout());
    ButterKnife.bind(this);
    mContext = this;
    setupActivityComponent(App.getAppComponent(),new ActivityModule(this));
    mPresenter.attachView(this);
    initEventAndData();
    

    }

    protected void setCommonBackToolBack(Toolbar toolbar, String title) {

    toolbar.setTitle(title);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
    toolbar.setNavigationOnClickListener(v -> onBackPressed());
    

    }

    @Override
    protected void onDestroy() {

    super.onDestroy();
    ButterKnife.unbind(this);
    if (mPresenter != null) mPresenter.detachView();
    

    }

    /**

    • 依赖注入的入口
    • @param appComponent appComponent
      */
      protected abstract void setupActivityComponent(AppComponent appComponent, ActivityModule activityModule);

      protected abstract int getLayout();
      protected abstract void initEventAndData();
      }

      1
      2
      多了setupActivityComponent()方法这就是依赖注入的入口好比。

    @Override
    protected void setupActivityComponent(AppComponent appComponent, ActivityModule activityModule) {

    DaggerActivityComponent.builder()
            .appComponent(appComponent)
            .activityModule(activityModule)
            .build()
            .inject(this);
    

    }
    ````

总结

这个项目是我私下自己在学习新的技术,并且运用在一起的项目,也是像对待产品一个对待这个app开发,后续会不断的学习和更新项目。本人也是个android小菜鸟,从最弱最弱的做起。