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跳转到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()
//                //到这里就已经产生了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发生了变化,和MainActivity是不一样的,这就是局部单例。

下面来把局部单例变为全局单例。

其它的类都不需要修改,只需要在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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值