我有以下简单的模块:
@Module
public class ApplicationModule {
private CustomApplication customApplication;
public ApplicationModule(CustomApplication customApplication) {
this.customApplication = customApplication;
}
@Provides @Singleton CustomApplication provideCustomApplication() {
return this.customApplication;
}
@Provides @Singleton @ForApplication Context provideApplicationContext() {
return this.customApplication;
}
}
Run Code Online (Sandbox Code Playgroud)
以及各自的简单组件:
@Singleton
@Component(
modules = ApplicationModule.class
)
public interface ApplicationComponent {
CustomApplication getCustomApplication();
Context getApplicationContext();
}
Run Code Online (Sandbox Code Playgroud)
我在这里创建组件:
public class CustomApplication extends Application {
...
private ApplicationComponent component;
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
@Override
public void onCreate() {
super.onCreate();
component = DaggerApplicationComponent.builder() …Run Code Online (Sandbox Code Playgroud) 我是匕首2中的新手和android中的依赖注入.我听说很多Android开发人员都使用匕首2.我理解它管理类之间的依赖关系,我们不再使用关键字"new"但我想知道为什么我应该使用它呢?它是否管理内存分配并最小化泄漏?它对应用程序的性能有好处吗?
我正在尝试使用Dagger 2(使用Android模块)向我的存储库提供一个Retrofit实例.买我面临错误:
错误:无法访问Retrofit
像毕加索这样的其他实例注入成功,我只是在改造时遇到了问题.
我的模块
@Module
class NetworkModule {
@Provides
@Singleton
fun providesRetrofit(): Retrofit {
return Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(URL_BASE)
.build()
}
@Provides
@Singleton
fun providesPicasso(context: Context): Picasso {
return Picasso.Builder(context)
.loggingEnabled(true)
.build()
}
@Provides
@Singleton
fun providesRemoteRepository(retrofit: Retrofit): RemoteRepository = RemoteRepository(retrofit)
@Provides
@Singleton
fun providesRepository(remote: RemoteRepository): Repository = RepositoryImp(remote)
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序组件
@Singleton
@Component(modules = arrayOf(
AppModule::class, NetworkModule::class, AndroidInjectionModule::class, ActivityBuilder::class
))
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun application(app: Application): Builder
fun build(): AppComponent
}
fun inject(application: AppApplication)
} …Run Code Online (Sandbox Code Playgroud) 我最近一直在将Dagger集成到一个使用ContentProviders的项目中.我在自定义Application对象中创建了一个ObjectGraph实例,基本上在每个托管组件中:
...然后,我调用getApplication(),向下转换到我的自定义Application对象,并通过我的Application类中的一些自定义实现强制注入.这似乎是根据我在Square看到的人发布的样本进行注射的规定方法.
这种模式不适用于ContentProvider实例,因为它们的生命周期与Application对象的生命周期没有预期的关联,即ContentProviders可以,并且正如我经常观察的那样,是在创建Application对象之前创建的(对于我尚未理解的原因).
所以...有没有人有一个使用Dagger注入ContentProviders的好方法?到目前为止,我已经通过isInjected()在每个ContentProvider的接口方法(插入,查询,更新,删除)的开头调用...基本上是一种懒惰的初始化形式.但这似乎远非理想.是否有更规定的方法来注入ContentProviders?
我想通过Dagger向项目引入依赖注入.以下代码用作描述注入静态类的问题的示例.
setupTextView()从多个类调用静态方法:
public abstract class TextViewHelper {
public static void setupTextView(TextView textView,
Spanned text,
TrackingPoint trackingPoint) {
textView.setText(text, TextView.BufferType.SPANNABLE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyApp.getTracker().track(trackingPoint);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
以下是如何使用辅助方法的一个示例:
TextViewHelper.setupTextView(this, R.id.some_text_view,
R.string.some_text,
TrackingPoint.SomeTextClick);
Run Code Online (Sandbox Code Playgroud)
辅助方法中使用的跟踪由应用程序类提供:
public class MyApp extends Application {
private static Tracking mTracking;
public void onCreate() {
super.onCreate();
mTracking = getTracking(getApplicationContext());
}
private Tracking getTracking(Context context) {
if (BuildConfig.DEBUG) {
return new NoTracking();
} else {
return new …Run Code Online (Sandbox Code Playgroud) 我dagger在Android应用程序中使用DI.我可以为模块外的其他类提供变量,但是如何更新它们呢?
示例:登录
我需要一个可以提供用户的AuthenticationModule .当应用程序启动时,用户未登录,因此它为null.但在成功进行身份验证后,LoginActivity需要设置User的值,以便通过AuthenticationModule通过应用程序的其他部分访问它.
简单地设置注入场的值对我来说不起作用.
它甚至可能吗?
我试图在Dagger2中做SubScoping.但是,我无法弄清楚这个编译错误: - > ...MyApplicationModule must be set发生在我的LogInFragment.如果有人试图对这个错误有所了解.我真的很高兴.
这是MyApplication类:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
MyInjector.initialize(this);
}
}
Run Code Online (Sandbox Code Playgroud)
这是MyInjector类:
public enum MyInjector {
INSTANCE;
MyApplicationComponent myApplicationComponent;
private MyInjector() {
}
public static void initialize(MyApplication myApplication) {
MyApplicationComponent myApplicationComponent = DaggerMyApplicationComponent.builder()
.myApplicationModule(new MyApplicationModule(myApplication))
.build();
INSTANCE.myApplicationComponent = myApplicationComponent;
}
public static MyApplicationComponent get() {
return INSTANCE.myApplicationComponent;
}
}
Run Code Online (Sandbox Code Playgroud)
这是MyApplicationComponent类:
@Component (modules = {MyApplicationModule.class})
public interface MyApplicationComponent {
}
Run Code Online (Sandbox Code Playgroud)
这是MyApplicationModule类 …
我在我的模块类中有一组@Singleton和@Provides方法,用于在整个应用程序中创建Singleton实例.一切都很好,除了几个瓶颈情况,如下所示:
步骤1.我正在OKHttpClient使用Auth令牌创建一个Retrofit实例,以便每次都进行经过身份验证的api调用(通过处理Auth令牌检索和插入SharedPreferences).但是,在我通过清除数据库和共享首选项值注销应用程序之后重新启动活动时,问题就开始了.
步骤2.注销后,我正在另一个请求获取auth令牌并SharedPreferences再次插入以供将来使用.
第3步:现在,如果我继续进行其余的api调用,则前面的Dagger @Singleton和@Provides方法实例保持相同,除非直到我通过从最近的任务中清除它来重新启动应用程序.(新的身份验证令牌未更新)
需要修复:
如何触发Dagger提供程序方法强制再次触发或撤消它?
是否有任何方法可以像应用程序重新启动时那样刷新应用程序类数据.
请找到我项目中使用的Dagger 2架构:
NetworkModule.java(Dagger Module类)
@Module
public class NetworkModule {
private Context context;
public NetworkModule(Application app) {
this.context = app;
}
@Provides
@Named("network.context")
Context providesContext() {
return context;
}
@Singleton
@Provides
OkHttpClient providesOkHttpClient(@Named("network.context")final Context context) {
final UserProfile userProfile = GsonUtils.createPojo(SharedPrefsUtils.getString(Constants.SHARED_PREFS.USERS_PROFILE, "",context), UserProfile.class);
Logger.i(userProfile != null && !TextUtils.isEmpty(userProfile.getAuth_token()) ? userProfile.getAuth_token() : "----OAuth token empty---");
OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); …Run Code Online (Sandbox Code Playgroud) 我有两个班,Foo<T>和Bar,这是互相依赖的,以及各种其他类.我使用Dagger-2进行依赖注入,但如果我天真地添加循环依赖,Dagger会在运行时遇到堆栈溢出.什么是重构类来解决这个问题的好方法,同时仍然使用Dagger注入所有其他依赖项,并且对现有调用的重复和更改最少?
我想用dagger 2注入我的Androidx片段.在我的活动中我有:
public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector
{
@Inject Reposetory reposetory;
@Inject DispatchingAndroidInjector<androidx.fragment.app.Fragment> dispatchingAndroidInjector;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public AndroidInjector<androidx.fragment.app.Fragment> supportFragmentInjector()
{
return dispatchingAndroidInjector;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我想要构建项目时,我收到此错误:
error: cannot find symbol class MapBuilder
Run Code Online (Sandbox Code Playgroud)
当我在DispatchingAndroidInjector 中将androidx.fragment.app.Fragment更改为Fragment时,我不再收到此错误.