在大多数情况下,处理案件时
AsyncTask
)执行后台处理Activity
或Fragment
Activity
或者Fragment
在用户线程完成后台处理之前可能会重新创建到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 保留片段
我不时地听说事件总线库可以处理活动,片段和后台线程之间的关系.(请参阅https://github.com/greenrobot/EventBus.它表示在活动,片段和后台线程中表现良好)
我遇到了一些非常受欢迎的事件总线库
我想知道,当处理活动,碎片和后台线程之间的关系时,事件总线方法与保留碎片方法有何不同?
推荐哪种方式?
android event-bus android-asynctask otto greenrobot-eventbus
我正在阅读GitHub上的Dagger2组件范围测试的源代码,我看到为被调用的活动定义了"自定义范围" @ActivityScope
,但我在其他项目中看到了它,包括具有其范围的4模块CleanArchitecture@PerActivity
.
但从字面上看,@ActivityScope
注释的代码如下:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.inject.Scope;
/**
* Created by joesteele on 2/15/15.
*/
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
Run Code Online (Sandbox Code Playgroud)
它在模块中"神奇地"可用:
@Module
public class ActivityModule {
@Provides @ActivityScope Picasso providePicasso(ComponentTest app, OkHttpClient client) {
return new Picasso.Builder(app)
.downloader(new OkHttpDownloader(client))
.listener(new Picasso.Listener() {
@Override public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
Log.e("Picasso", "Failed to load image: " + uri.toString(), e);
}
})
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
或者CleanArchitecture …
你有一个特定的包,你把所有与Dagger相关的课程放在哪里?
或者你把它们放在他们注入的相关课程旁边,例如,如果你有一个MainActivityModule
和MainActivityComponent
,你把它们放在与你相同的包装中MainActivity
.
此外,我见过很多人将组件定义为内部类,例如ApplicationComponent
,在Application
类中定义的组件.你认为这是一个好习惯吗?
我有一个核心Android库,我使用@Singleton作用域来定义CoreComponent广告,以注入CoreModule提供的类的实例.
@Singleton
@Component(modules = {CoreModule.class})
public interface CoreComponent {
void inject(SomeClass target);
}
@Module
public class CoreModule {
@Singleton
@Provides
CoreRepository provideCoreRepository() {
return new CoreRepositoryImpl();
}
}
Run Code Online (Sandbox Code Playgroud)
我想从另一个依赖于核心库的Android库访问相同的@Singleton实例,并且正在使用另一个组件.
@Singleton
@FooScope
@Component(modules = {CoreModule.class, FooModule.class})
public interface FooComponent {
void inject(SomeActivity target);
}
public class FooActivity extends AppCompatActivity {
@Inject
public CoreRepository repo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
injectDependencies();
super.onCreate(savedInstanceState);
}
[...]
}
Run Code Online (Sandbox Code Playgroud)
上面的代码构建,但@Singleton范围是Component的"本地".换句话说,有两个单例实例,一个用于CoreComponent,另一个用于FooComponent.
Android Application
??? Foo Library
| ??? Core Library
??? Bar Library
| ??? …
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试将Dagger 2集成到Android应用程序中.我的项目设置如下:
在我的库项目中,我定义了一个类,我稍后将其注入到库中的其他需要它的类(活动和常规类)以及应用程序项目中.
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
Run Code Online (Sandbox Code Playgroud)
现在 - 例如在我的片段或活动或常规类中,我将按如下方式注入上述Singleton:
public class SomeClass{
@Inject
MyManager myManager;
}
Run Code Online (Sandbox Code Playgroud)
或者我想,因为在实践中,myManager总是为空.显然它的构造函数从未被调用过,所以我想我必须错过配置方面的东西?或者我可能误解了文档,但这并不意味着以这种方式工作?MyManager类的目的是成为应用程序范围内可访问的组件累积实体 - 这就是我选择@Singleton的原因.
UPDATE
为了避免混淆:我在评论中提到了我的组件,我认为 - 这是指"基于组件的设计"意义上的组件,与匕首无关.我上面列出了基于匕首的代码 - 我的代码中没有任何与dagger相关的代码.
当我开始添加@Component时,我遇到了一些编译器问题,因为我的dagger2设置不正确 - 请查看这个关于如何正确设置dagger2的真正有用的线程:https://stackoverflow.com/a/29943394/1041533
更新2
这是我更新的代码,基于G. Lombard的建议 - 我更改了代码如下 - 原始的Singleton在库项目中:
@Singleton
public class MyManager{
@Inject
public MyManager(){
//Do some initializing
}
}
Run Code Online (Sandbox Code Playgroud)
库项目中还有bootstrap类:
@Singleton
@Component
public interface Bootstrap {
void initialize(Activity activity);
}
Run Code Online (Sandbox Code Playgroud)
然后我在我的活动中使用上面的Bootstrap类(在我的具体应用程序中,而不是在库项目中!但是我在库中也有访问Bootstrap以注入MyManager的类/活动):
public class MyActivity extends Activity{
@Inject …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Dagger依赖注入实现到我的应用程序中,但我很难理解它是如何工作的,特别是来自Spring,其中DI更容易,更具声明性.
我想要做的是拥有一堆可以在我的应用程序中使用的注入就绪对象,即SharedPreferences,Network对象(OkHttp,Retrofit,Picasso ...),以及RxJava的EventBus和SchedulerProvider对象.
这个样本似乎提供了我需要的一切,但我无法掌握一些概念.
在上一页中引用的另一个示例中,他们创建了一个使用NetModule中提供的Retrofit对象的GithubService.为此,他们创建了一个像这样的GithubComponent:
@UserScope
@Component(dependencies = NetComponent.class, modules = GitHubModule.class)
public interface GitHubComponent {
void inject(MainActivity activity);
}
Run Code Online (Sandbox Code Playgroud)
他们使用UserScope注释定义自己的范围.既然不能使用@Singleton,这是否意味着该对象不会是Singleton?范围如何真正影响DI?似乎他们只宣布一个命名范围没有更多的影响,但我不确定.
此外,我的应用程序是使用活动与碎片建立的.我是否必须为我的应用中的每个片段创建一个组件?即我需要在整个应用程序中使用我的REST api服务,我是否必须使用它们为每个屏幕声明一个组件?这增加了所需的样板代码量,因此听起来不是很干净.