Dagger局部單例和全局單例-@Singleton

提供一個HttpObject對象

public class HttpObject {
}

提供一個Module

@Singleton
@Module
public class HttpModule{
    @Singleton
    @Provides
    public HttpObject provederHttpObject(){
        return new HttpObject();
    }
}

單例類的使用需要在@Module修飾的類和@Provides修飾的方法上分別添加@Singleton。

提供一個Component

@Singleton
@Component(modules = {HttpModule.class,DatabaseModule.class})
public interface MyComponent 
    void injectMainActivity(MainActivity mainActivity);
    void injectSecondActivity(SecondActivity secondActivity);
}

同時在@Component修飾的Componet上添加@Singleton。

從MainActivity跳轉(zhuǎn)到SecondActivity,來觀察HttpObject 是否是一個對象。

MainActivity.java

public class MainActivity extends AppCompatActivity {
    @Inject
    HttpObject httpObject1;
    @Inject
    HttpObject httpObject2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //第一種注入方法
        DaggerMyComponent.create().injectMainActivity(this);
        //第二種注入方法
//        DaggerMyComponent.builder().httpModule(new HttpModule())
//                .build()
//                //到這里就已經(jīng)產(chǎn)生了module和component對象
//                .injectMainActivity(this);

        Log.i("log",httpObject1.hashCode()+"");//189244270
        Log.i("log",httpObject2.hashCode()+"");//189244270
        Log.i("log",databaseObject.hashCode()+"");//69880476
    }

    public void jump(View view) {
        this.startActivity(new Intent(this,SecondActivity.class));
    }
}

SecondActivity.java

public class SecondActivity extends AppCompatActivity {
    @Inject
    HttpObject httpObject;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DaggerMyComponent.create().injectSecondActivity(this);
        Log.i("log",httpObject.hashCode()+"");//115744208
    }
}

可以看到,在MainActivity中HttpObject的HashCode是一樣的,說明是一個對象;而在SecondActivity中HttpObject的HashCode發(fā)生了變化,和MainActivity是不一樣的,這就是局部單例。

下面來把局部單例變?yōu)槿謫卫?/p>

其它的類都不需要修改,只需要在Application中操作即可。
MyApplication.java

public class MyApplication extends Application {
    private MyComponent myComponent;
    @Override
    public void onCreate() {
        super.onCreate();
        myComponent= DaggerMyComponent.builder()
                .httpModule(new HttpModule())
//                .presenterComponent(DaggerPresenterComponent.builder()
//                .presenterModule(new PresenterModule())
                .build();
    }
    public MyComponent getAppComponent(){
        return myComponent;
    }
}

在Activitie中使用的如下:

((MyApplication)getApplication()).getAppComponent().injectMainActivity(this);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容