【发布时间】:2018-07-10 11:33:39
【问题描述】:
我正在学习 Dagger2 并尝试保持简单的示例并尽可能隔离其他功能以理解所需的部分。
*编辑:当我开始学习时,我仍然很困惑,Dagger 对于初学者来说似乎太混乱了,我在问你是否可以在创建 Activity 时将相同的用户注入到相同的 Activity。 User 和 Activity 应该是一对一的关系。
- Activity1
- Activity2
- Activity3
这是第一次创建活动的时候。
我的问题是您从 Activity3 导航回 Activity2,那么是否可以仅使用 Dagger 再次注入 User(101)?您回到 Activity1 并从 Application 内部创建的组件中获得 User(100) 而不是新的 User 或 Singleton 对象。
我在想 Dagger 像 Pool 一样保留对象,并将 Activity 实例与对象哈希链接或保留有关注入对象的状态或内部引用,我在问这是否可能。*
如何注入一个 Activity 独有的对象的相同实例,它是在第一次创建该 Activity 时创建的,并在我使用 @ActivityScope 导航到或启动该 Activity 时再次注入?我使用下面的sn-ps来构建这个例子
public class User {
private String name;
private String email;
public User() {
name = "Unknown";
email = "abc@xyz.com";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
范围
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
模块类
@Module
public class UserModule {
@ActivityScope
@Provides
User provideUser() {
return new User();
}
}
组件
@ActivityScope
@Component(modules = {UserModule.class})
public interface UserComponent {
void inject(MainActivity mainActivity);
void inject(SecondActivity secondActivity);
void inject(ThirdActivity thirdActivity);
}
我从 MyApplication 和 MainActivity 中获取组件以使用 userComponent = DaggerUserComponent.create(); 测试注入的对象
public class MainActivity extends AppCompatActivity {
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UserComponent daggerUserComponent = DaggerUserComponent.create();
daggerUserComponent.inject(this);
TextView textView = findViewById(R.id.textView);
textView.setText("Main User: " + user.hashCode());
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
每次旋转设备时,这个都会返回不同的User,这是预期的行为,因为每次都会创建新的UserComponent。
public class SecondActivity extends AppCompatActivity {
@Inject
User user;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
startActivity(intent);
}
});
((MyApplication) getApplication()).getUserComponent().inject(this);
TextView textView = findViewById(R.id.textView);
textView.setText("Second User: " + user.hashCode());
}
}
应用类
public class MyApplication extends Application {
private UserComponent userComponent;
@Override
public void onCreate() {
super.onCreate();
userComponent = DaggerUserComponent.create();
}
public UserComponent getUserComponent() {
return userComponent;
}
}
SecondActivity 和 ThirdActivity 使用 MyApplication 中的 UserComponent。
我的问题是为什么这些类没有让每个活动的用户都是唯一的?
它们被注入了相同的User,即使在它们之间导航之后,我怎样才能让这些类拥有自己的User?
【问题讨论】:
-
您可以在
Application类中添加创建组件的代码吗? -
@ThiagoPorciúncula 添加了 MyApplication 类。我发现我问的是不可能的。即使在 Activity 被销毁后,您也无法为每个存在的 Activity 获取唯一用户。我只是想知道我是否重新启动 ThirdActivity 并获得上次获得的相同实例,或者我下次获得的实例将与上次使用应用程序类中的组件相同。它的行为与
@Singleton相同,并为 ActivitySecond 和 ActivityThird 返回相同的用户