相关疑难解决方法(0)

使用像Otto或EventBus这样的事件库是一种处理活动,片段和后台线程之间关系的推荐方法

在大多数情况下,处理案件时

  • 用户thread(AsyncTask)执行后台处理
  • 将计算结果传回给ActivityFragment
  • Activity或者Fragment在用户线程完成后台处理之前可能会重新创建

到目前为止,从许多可靠的来源,我可以看到推荐的方法是使用 保留片段

来源

我不时地听说事件总线库可以处理活动,片段和后台线程之间的关系.(请参阅https://github.com/greenrobot/EventBus.它表示在活动,片段和后台线程表现良好)

我遇到了一些非常受欢迎的事件总线库

我想知道,当处理活动,碎片和后台线程之间的关系时,事件总线方法与保留碎片方法有何不同?

推荐哪种方式?

android event-bus android-asynctask otto greenrobot-eventbus

44
推荐指数
1
解决办法
2万
查看次数

Dagger2自定义范围:自定义范围(@ActivityScope)如何实际工作?

我正在阅读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 …

android scope android-activity dagger-2

42
推荐指数
2
解决办法
1万
查看次数

您如何组织Dagger 2模块和组件?

你有一个特定的包,你把所有与Dagger相关的课程放在哪里?

或者你把它们放在他们注入的相关课程旁边,例如,如果你有一个MainActivityModuleMainActivityComponent,你把它们放在与你相同的包装中MainActivity.

此外,我见过很多人将组件定义为内部类,例如ApplicationComponent,在Application类中定义的组件.你认为这是一个好习惯吗?

java android dagger-2

36
推荐指数
2
解决办法
1万
查看次数

Dagger 2:在不同库模块上的多个具有相同Scope的Component之间提供相同的实例

我有一个核心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)

java android dagger-2

18
推荐指数
1
解决办法
7654
查看次数

Android @Singleton上的Dagger 2注释类没有被注入

我目前正在尝试将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)

java android dagger dagger-2

12
推荐指数
2
解决办法
1万
查看次数

Dagger2和Android

我正在尝试将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服务,我是否必须使用它们为每个屏幕声明一个组件?这增加了所需的样板代码量,因此听起来不是很干净.

android dagger-2

5
推荐指数
1
解决办法
992
查看次数