Android--帶你一點點封裝項目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)

來源:互聯網
上載者:User

標籤:log   ppm   ack   產生   abstract   html   java   使用   etc   

1,這一篇部落格是和大家一起來封裝我們最後的Dagger2,其實之前也寫過關於簡單的Dagger2,這裡是地址,完全沒瞭解的同學可以先去看一下這篇,感謝很多小夥伴一直在耐心的等待這一篇

2,Dagger2可以說是些技術中最難上手的,不過把主要的四個註解理解到位了,基本上就可以用了:

@Inject Inject主要有兩個作用,一個是使用在建構函式上,通過標記建構函式讓Dagger2來使用(Dagger2通過Inject標記可以在需要這個類執行個體的時候來找到這個建構函式並把相關執行個體new出來)從而提供依賴,另一個作用就是標記在需要依賴的變數讓Dagger2為其提供依賴。@Provide 用Provide來標註一個方法,該方法可以在需要提供依賴時被調用,從而把預先提供好的對象當做依賴給標註了@Injection的變數賦值。provide主要用於標註Module裡的方法@Module 用Module標註的類是專門用來提供依賴的。有的人可能有些疑惑,看了上面的@Inject,需要在建構函式上標記才能提供依賴,那麼如果我們需要提供的類建構函式無法修改怎麼辦,比如一些jar包裡的類,我們無法修改源碼。這時候就需要使用Module了。Module可以給不能修改源碼的類提供依賴,當然,能用Inject標註的通過Module也可以提供依賴@Component Component一般用來標註介面,被標註了Component的介面在編譯時間會產生相應的類的執行個體來作為提供依賴方和需要依賴方之間的橋樑,把相關依賴注入到其中。

  下面你這張圖片很相像的概括了上面四個標籤的作用

        

   還有兩個常見的標籤是@Scope和@Qulifier ,@Scope標籤你可以將它理解成單例標記,@Qulifier可以簡單的理解成區分需要的對象有兩個或者兩個以上構造方法(主要用於區分),

     首先我們用一個簡單的情境來引入吧,現在我們項目使用MVP架構, 而引入Dagger2的主要目的是解決我們在Activity中new Presenter對象,先看一下我們在引用之前代碼是怎麼樣的吧

package com.qianmo.myview2;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.qianmo.myview2.presenter.HiPresenterImpl;public class MainActivity extends AppCompatActivity {    private HiPresenterImpl hiPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //直接new對象        hiPresenter = new HiPresenterImpl();    }}   

  這時候引用Dagger2,再看看我們的代碼

   MainActiivty.java

package com.qianmo.myview2;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.qianmo.myview2.presenter.HiPresenterImpl;import javax.inject.Inject;public class MainActivity extends AppCompatActivity {    @Inject    private HiPresenterImpl hiPresenter;  //這裡改變了     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

  Presenter.java

package com.qianmo.myview2.presenter;import com.qianmo.myview2.contract.HiContract;import javax.inject.Inject;/*** Created by MVPHelper on 2016/10/20*/public class HiPresenterImpl implements HiContract.Presenter{    @Inject    public HiPresenterImpl(){    }}

  光上面的這兩個標註還不夠,我們還要建立對應的Module和Component

  MainModule.java

package com.qianmo.myview2.di.module;import com.qianmo.myview2.presenter.HiPresenterImpl;import dagger.Module;import dagger.Provides;/** * Created by wangjitao on 2017/3/9 0009. * E-Mail:[email protected] */@Modulepublic class MainModule {    @Provides    HiPresenterImpl provideHiPresenterImpl() {        return new HiPresenterImpl();    }}

  MainComponent.java

package com.qianmo.myview2;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import com.qianmo.myview2.di.component.DaggerMainComponent;import com.qianmo.myview2.di.module.MainModule;import com.qianmo.myview2.presenter.HiPresenterImpl;import javax.inject.Inject;public class MainActivity extends AppCompatActivity {    @Inject    private HiPresenterImpl hiPresenter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        DaggerMainComponent.builder().mainModule(new MainModule()).build().inject(this);        hiPresenter.say();    }}

  這樣我們就簡單的使用了,再來簡單的分析一下流程 :被 @Inject 註解的代碼存在某種聯絡,當代碼執行到 @Inject 的時候程式會自動進入到這個類的構造方法中,如果正巧這個構造方法也被 @Inject 修飾了,那麼系統就會幫我們自動建立對象。

3,封裝

  由上面的項目我們進行過度,但我們封裝的時候,主要是要在activity和fragment來持有Presenter對象,先來封裝Activity,這是目錄

       

  先看一下我們之前的presenter的建立,在BaseActivity中添加抽象方法,在Mainactivity中重寫方法再new對象

  

      

     先建立Application的Module,Application的話主要是提供上下文環境,而appliacation中的component,只是提供Context展示方法get方法

  AppModule.java

package com.qianmo.mvpproject.di.module;import com.qianmo.mvpproject.App;import com.qianmo.mvpproject.di.ContextLife;import javax.inject.Singleton;import dagger.Module;import dagger.Provides;/** * Created by wwangjitao on 16/8/7. */@Modulepublic class AppModule {    private final App application;    public AppModule(App application) {        this.application = application;    }    @Provides    @Singleton    @ContextLife("Application")    App provideApplicationContext() {        return application;    }}

  AppComponent.java

package com.qianmo.mvpproject.di.component;import com.qianmo.mvpproject.App;import javax.inject.Singleton;import com.qianmo.mvpproject.di.ContextLife;import com.qianmo.mvpproject.di.module.AppModule;import dagger.Component;/** * Created by wangjitao on 16/8/7. */@Singleton@Component(modules = AppModule.class)public interface AppComponent {    @ContextLife("Application")    App getContext();  // 提供App的Context}

  而Activity的Module主要是提供Activity和上下文Context對象,對應的Activity的component主要是將提供的對象注入到需要它的地方

     ActivityModule.java

package com.qianmo.mvpproject.di.module;import android.app.Activity;import android.content.Context;import com.qianmo.mvpproject.base.BaseRxPresenter;import com.qianmo.mvpproject.di.ActivityScope;import dagger.Module;import dagger.Provides;/** * Created by codeest on 16/8/7. */@Modulepublic class ActivityModule {    private Activity mActivity;    public ActivityModule(Activity activity) {        this.mActivity = activity;    }    @Provides    @ActivityScope    public Activity provideActivity() {        return mActivity;    }    @Provides    public Context provideContext() {        return mActivity;    }}

  ActivityComponent.java

package com.qianmo.mvpproject.di.component;import android.app.Activity;import com.qianmo.mvpproject.di.ActivityScope;import com.qianmo.mvpproject.di.module.ActivityModule;import com.qianmo.mvpproject.ui.activity.CheckVersionActivity;import dagger.Component;/** * Created by codeest on 16/8/7. */@ActivityScope@Component(dependencies = AppComponent.class, modules = ActivityModule.class)public interface ActivityComponent {    Activity getActivity();    void inject(CheckVersionActivity welcomeActivity);}

  再在BaseActivity中去調用

  BaseActivity.java

package com.qianmo.mvpproject.base;import android.app.Activity;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.Toolbar;import javax.inject.Inject;import com.qianmo.mvpproject.App;import com.qianmo.mvpproject.R;import com.qianmo.mvpproject.di.component.ActivityComponent;import com.qianmo.mvpproject.di.component.DaggerActivityComponent;import com.qianmo.mvpproject.di.module.ActivityModule;import butterknife.ButterKnife;import butterknife.Unbinder;/** * Created by wangjitao on 2016/11/8 0008. * 基類Activity的封裝 * 一般使用mvp模式的話會在BaseActivity中進行P和V的初始化綁定 */public abstract class BaseActivity<T extends BasePresenter> extends AppCompatActivity implements BaseView {    //這裡添加了注入    @Inject    protected T mPresenter;    .......省略    protected void onCreate(@Nullable Bundle savedInstanceState) {        .......省略        super.onCreate(savedInstanceState);        setContentView(getLayout());                //這裡添加了注入的調用        initInject();        if (mPresenter != null)            mPresenter.attachView(this);           }      //添加調用方法    protected ActivityComponent getActivityComponent(){        return  DaggerActivityComponent.builder()                .appComponent(App.getAppComponent())                .activityModule(getActivityModule())                .build();    }    protected ActivityModule getActivityModule(){        return new ActivityModule(this);    }}

  ok,這樣我們就封裝了,同理Fragment,這裡就不廢話寫了,下面把github地址貼上,後面打算這些東西寫一個展示類的app,又要到處找介面了,See You Next Time !

Android--帶你一點點封裝項目 MVP+BaseActivity+Retrofit+Dagger+RxJava(三)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.