我想在Android上使用Dagger将一个实例Activity注入另一个类,如下所示:
class PresentationLayer{
Activity mActivity;
@Inject
public PresentationLayer(Activity activity){
this.mActivity = activity;
}
public void presentData(User user){
((TextView)mActivity.findViewById(R.id.username))
.setText(user.getName());
//...
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我能够做的注入,但对所有领域Activity都null在注射时间.
这是我如何进行注射:
我Activity本身就是一个模块.
@Module(
complete = false
)
class MainActivity extends Activity{
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.main_activity);
ObjectGraph objectGraph = CustomApplication.getObjectGraph();
PresentationLayer pres = objectGraph.get(PresentationLayer.class);
}
@Provides Activity provideActivity(){
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要模块
@Module(
entryPoints = PresentationLayer.class,
includes = MainActivity.class
)
class DaggerModule{
@Provides PresentationLayer …Run Code Online (Sandbox Code Playgroud) 我正在使用Dagger将依赖项注入到Android应用程序中,我偶然发现了一个问题,我不确定如何以一种干净的方式解决问题.
我试图实现的是实现帮助并将其注入我的活动中,并让这些帮助者也包含注入的成员.
什么有效
我的助手注入的活动:
public class MyActivity extends Activity {
@Inject SampleHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((MyApplication) getApplication()).inject(this);
Log.i("debug", "helper = " + helper);
Log.i("debug", "helper context = " + helper.context);
}
}
Run Code Online (Sandbox Code Playgroud)
创建对象图的应用程序:
public class MyApplication extends Application {
private ObjectGraph graph;
@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(getModules());
}
private Object[] getModules() {
return new Object[] { new MyModule(this) };
}
public void inject(Object target) {
graph.inject(target);
}
}
Run Code Online (Sandbox Code Playgroud)
当我直接实例化SampleHelper类时,注入工作非常完美,而SampleHelper类又接收注入的应用程序上下文: …
我正在研究一个Android应用程序,我正在尝试注入一个在抽象类中参数化的字段:BaseListFragment
public abstract class BaseListFragment<E, A extends ArrayAdapter<E>, S> extends BaseFragment
{
@Inject protected S service;
}
Run Code Online (Sandbox Code Playgroud)
但是我在编译时遇到以下错误:错误:找不到符号类S.
这是我的BaseFragment代码:
public class BaseFragment extends Fragment
{
@Override public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
((App) getActivity().getApplication()).inject(this);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的服务模块:
@Module(
complete = false,
library = true
)
public class ServiceModule
{
@Provides @Singleton BucketService provideBucketService(RestAdapter restAdapter)
{
return restAdapter.create(BucketService.class);
}
@Provides @Singleton ProjectService provideProjectService(RestAdapter restAdapter)
{
return restAdapter.create(ProjectService.class);
}
@Provides @Singleton ShotService provideShotService(RestAdapter restAdapter)
{
return restAdapter.create(ShotService.class);
}
@Provides @Singleton TeamService provideTeamService(RestAdapter …Run Code Online (Sandbox Code Playgroud) 我最近更新了匕首2.8到2.9匕首.并添加了上一版本的文档,如下所示:
- @BindsInstance为组件构建器添加了轻松绑定在图外部构造的实例.
- 生产者:添加ProducerMonitor.ready (),当所有生产者的输入都可用时调用.
- 删除@Provides(type =...)用法.dagger.multibindings而是使用注释.@Produces.type也被删除了.
- 现在验证所有绑定方法,即使它们在特定用途中未使用 @Component
- @Component.dependencies不能再包括了@Modules.
我想知道这些新功能如何:
谢谢!!
注意:我是dagger 2的新手,但您希望能够最大限度地利用此库.
有没有人将Lombok 1.16与Dagger2一起使用?
我当前的代码如下:
@AllArgsConstructor(onConstructor = @__(@Inject))
public class JuiceMaker {
private final Apple apple;
Run Code Online (Sandbox Code Playgroud)
错误是:
JuiceMaker cannot be provided without an @Inject constructor or from an @Provides-annotated method.
Run Code Online (Sandbox Code Playgroud)
如果没有Lombok批注,这实际上可以工作,因此:
public class JuiceMaker {
private final Apple apple;
@Inject
public JuiceMaker(Apple apple){
this.apple = apple
}
}
Run Code Online (Sandbox Code Playgroud)
作品
新的AndroidStudio 1.1版本引入了单元测试支持.此URL http://tools.android.com/tech-docs/unit-testing-support提供了如何设置IDE以运行Android源的JUnit测试的分步说明.
这个插件https://bitbucket.org/hvisser/android-apt用于向AS提供Dagger2生成的文件,它适用于通常的Android代码,但不幸的是,没有为任何JUnit测试类生成Dagger2文件.我试着像配置依赖
androidTestApt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT'
根据android-apt插件文档但没有成功.
我认为问题出在单元测试的不同源目录中 - src/test/java而不是src/androidTest/javaandroid检测所使用的.
您能否提供任何帮助或信息如何解决这个问题?
我正在努力了解@ReusableDagger范围的使用.从文档中我可以理解的是,如果提供程序的作用域@Singleton或任何其他自定义作用域,则首先创建对象,然后在组件的整个生命周期中对其进行高速缓存.因此,对于并不总是需要相同实例或不经常使用的对象,这种方法最终会浪费内存.
但是如果我们选择一个非范围的提供者,每次它都会创建一个新实例,并且由于对象实例化很昂贵,特别是在Android等环境中,分配可能很昂贵,这可能会导致性能问题.
@Reusable范围位于无范围和范围实例之间.从文档中
有时您希望限制实例化@Inject构造的类或调用@Provides方法的次数,但您不需要保证在任何特定组件或子组件的生命周期中使用完全相同的实例
它是如何工作的?假设我有一个可重用的提供程序,AppComponent它不会总是给我相同的实例吗?
如果我在任何中注入相同的依赖项Subcomponent,我将获得相同的实例吗?什么时候将为GC释放缓存的对象?
我尝试了一个示例,@Reusable在我的AppComponent模块中创建一个对象并从我的子组件中注入相同的对象.
我能看到的是它的表现完全一样@Singleton.
我们可以从中获得哪些性能改进@Reusable?
我们应该选择哪些可能的用例@Reusable?
将所有无状态对象(无论我们是否获得相同的实例)都包括在内,例如Util类,Gson,Glide等,这是一个好主意@Reusable吗?
我正在我的测试项目中尝试 Hilt DI。我在 SingletonComponent 中安装了以下模块,就 Android 而言,它是 applicationComponent。但是,当我尝试使用 @Singleton 来确定提供方法的范围时,出现以下错误。
MyApplication_HiltComponents.ViewModelC repeats modules with scoped bindings or declarations:
public abstract static class SingletonC implements MyApplication_GeneratedInjector,
^
- com.test.catalogue.presentation.application.MyApplication_HiltComponents.SingletonC also includes:
- com.test.catalogue.di.modules.RetrofitModule with scopes: @javax.inject.Singleton
Run Code Online (Sandbox Code Playgroud)
以下是我的模块声明。
改造模块:
@Module(includes = {OKHttpModule.class})
@InstallIn(SingletonComponent.class)
public class RetrofitModule {
@Provides
@Singleton
public MyApi providesAPI(Retrofit retrofit) {
return retrofit.create(MyApi.class);
}
@Provides
@Singleton
public Retrofit providesRetrofit(OkHttpClient okHttpClient, GsonConverterFactory gsonConverterFactory, LiveDataAdapterFactory liveDataAdapterFactory) {
return new Retrofit.Builder()
.client(okHttpClient)
.addCallAdapterFactory(liveDataAdapterFactory)
.addConverterFactory(gsonConverterFactory)
.baseUrl(BuildConfig.API_URL)
.build();
}
@Provides
public GsonConverterFactory providesGsonConverterFactory() { …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到如何在特定片段相关场景中定义 Hilt 的解决方案。我有以下设置:
父片段 1 使用依赖项 A。我只想在该父片段及其所有子片段之间共享该依赖项的实例。父片段 2 + 其子片段应使用与父片段 1 + 子片段不同的实例。一般来说,他的结构应该只有任何给定依赖关系的两个实例 - 一个用于第一个流,一个用于第二个流。
我可以看到自定义范围可能在这里工作,但我不确定如何在 Hilt 中使用它。
我正在尝试将数据添加到 firestore。我也想用匕首来做到这一点。但我不断收到此错误。你能帮我吗......
** 默认 FirebaseApp 在此进程 com.example.vvvv 中未初始化。确保首先调用 FirebaseApp.initializeApp(Context)。**
Firestore存储库
class FirestoreRepository @Inject constructor(private val usersRef:
CollectionReference) {
fun saveSearchResults(userEntities: List<UserEntity>) {
usersRef.add(userEntities).addOnCompleteListener { task ->
when (task.isSuccessful) {
true -> Log.d(ContentValues.TAG, "added:success")
false -> Log.d(ContentValues.TAG, "added:unsuccess")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
视图模型
@HiltViewModel
class UserListViewModel @Inject constructor(private val repository: RoomRepository, private
val firestoreRepository: FirestoreRepository) :
ViewModel() {
private val _users = MutableLiveData<List<User>>()
val users: LiveData<List<User>>
get() = _users
var userData: MutableLiveData<List<User>> = MutableLiveData()
fun userSearch(term: String) {
viewModelScope.launch {
loadFromCache(term) …Run Code Online (Sandbox Code Playgroud)