小编Mar*_*ano的帖子

Android上的Dagger 2.存储和访问@Singleton组件的不同方法

这是关于如何存储@Singleton作用域Dagger 2组件的第N个问题,其寿命应该等于应用程序的生命周期.

在使用Dagger 2的Android应用程序中,通常至少有一个组件是@Singleton作用域,并且应该持续所有应用程序的生命周期:由于这些要求,它通常被初始化并存储在自定义Application类中.

由于我们的应用程序的所有部分都必须可以访问此Component的实例,因此我看到过这样的代码:

1.将组件存储在应用程序类内的公共静态变量中.

public class App extends Application {

    public static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this)).build();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样它可以在任何其他地方访问:

App.appComponent.inject(this);
Run Code Online (Sandbox Code Playgroud)

2.将组件存储在应用程序实例内的私有变量中,并为其创建静态访问器.

public class App extends Application {

    private static AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        appComponent = DaggerAppComponent.builder()
                .appModule(new AppModule(this)).build();
    }

    public static AppComponent getAppComponent() {
        return appComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样它可以在任何其他地方访问:

App.getAppComponent().inject(this);
Run Code Online (Sandbox Code Playgroud)

3.将组件存储在应用程序实例内的私有变量中,并为其创建非静态访问器.

public class App extends Application {

    private AppComponent appComponent;

    @Override
    public void onCreate() { …
Run Code Online (Sandbox Code Playgroud)

java android dagger-2

11
推荐指数
1
解决办法
1638
查看次数

Okhttp 3.x 动态添加/删除验证器/拦截器

是否可以向现有Okhttp实例添加/删除身份验证器和/或拦截器?如果是,如何?

java authenticator interceptor okhttp

7
推荐指数
1
解决办法
2582
查看次数

在onCreateView()之前调用过onSaveInstanceState()吗?

我正在使用android数据绑定,并使用以下命令将片段的布局扩大为全局binding变量:

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    binding = MyFragmentBinding.inflate(inflater, container, false);
    return binding.getRoot();
}
Run Code Online (Sandbox Code Playgroud)

我收到了一些nullpointer崩溃,崩溃解析指向此行:

@Override
public void onSaveInstanceState(Bundle outState) {
    binding.mapView.onSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)

错误是: Caused by java.lang.NullPointerException: Attempt to read from field 'com.google.android.gms.maps.MapView net.kjulio.myapp.databinding.MyFragmentBinding.mapView' on a null object reference;

为什么这样?在我看来,这只有在onSaveInstanceState()之前被调用时才有可能onCreateView()。这是possilbe吗?

android android-fragments

7
推荐指数
0
解决办法
326
查看次数

在Android应用中抽象Realm的正确方法

我在Android应用程序中尝试Realm.io,为了保持安全,我想抽象数据库层,以便在需要时我可以切换回基于标准SQLite的数据库而无需重写大多数应用程序.

然而,由于它的特殊性,我发现很难正确地抽象Realm:

  • 当绑定到领域时,RealmObjects是代理,所以我不能传递它们,因为它们是POJO.
  • 所有Realm实例都需要为它们使用的每个线程正确打开和关闭.

我已经使用最近的Realm.copyFromRealm()API而不是传递绑定到Realm的RealmObjects来解决这些限制,但这种方式我认为我正在失去使用领域的所有好处(我呢?).

有什么建议?

android abstraction realm

6
推荐指数
1
解决办法
1073
查看次数

在 API23+ 上使用 FusedLocationApi.setMockMode() 和 setMockLocation() 进行仪器测试

我想编写一个仪器测试来验证使用 API23+ 上的 FusedLocation API 请求位置更新的应用程序的行为。

我有一些要求:

  • 测试必须在模拟器 (AVD) 中运行,因为我希望测试在 Travis CI 或 Circle CI 等持续集成服务中运行。
  • 我想使用 UI Automator 测试 Marshmallow 权限请求对话框是否正确弹出。
  • 我想通过使用断言检查 requestLocationUpdates() 返回的 Location 对象来确保我的代码正常工作。

由于需要在模拟设备上进行测试,因此我们必须使用 FusedLocation.setMockLocation() 来获取位置,否则 requestLocationUpdates() 将不会产生任何结果。

到目前为止,我遇到了这些问题:

  • setMockMode() 和 setMockLocation() 都需要位置权限:这意味着我必须在测试代码中请求位置权限,并且一旦我的测试代码到达 requestLocationUpdates() 调用,它就不会再次请求权限(因为它已经拥有它)从而不允许我使用 UI Automator 测试权限请求对话框。
  • setMockLocation() 需要在开发人员选项中手动设置“允许模拟位置”,因此持续集成将会失败,因为每次构建都会创建一个新的模拟器,并且默认情况下会禁用“允许模拟位置”。

在我看来,我已经走进了死胡同。请证明我错了!

testing android

5
推荐指数
0
解决办法
210
查看次数

Android MVP:这只是启用测试的借口吗?

老实说,我无法理解所有这些关于Android的MVP和类似的东西:它的真正意义何在?

到目前为止,我看到在Android中使用MVP的唯一实际原因是从框架类(即活动,服务,碎片......)中"提取"可单元测试的代码片段,否则这些代码将很难(或不可能)进行测试.

这很好但是这样活动(和其他框架类)最终会在可能的情况下(即处理框架不可知代码时)将工作委托给演示者,并在不处理时直接进行工作.因为这个演示者最终看起来很奇怪,因为它有一些镜像Activity生命周期的方法(onStart,onResume,clickListeners ......).我想知道这是不是代码味?

最重要的是,我看到大量的库/模式来构建MVP Android应用程序,但老实说,我没有看到它们真正的好处:让每个Activity手动创建和管理自己的演示者有什么缺点?我认为将Activity和Presenter相互分离没有任何好处,因为演示者只是从Activity中"提取"某些代码,它将根据定义与它紧密耦合,只要主持人这听起来就很好.仅包含严格的表示逻辑(业务逻辑的其余部分将进入专用类,这些类对View/Presenter二人组不了解).

我对这个话题感到有些迷茫,我想就此事提出一些其他意见,以获得更大的视角.

mvp android

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

Android:直接启动正在开发的活动/片段

有时您必须向现有应用程序添加新活动/片段.可以嵌套此活动/片段,以便为了访问它,用户必须打开应用程序并在到达之前浏览UI的多个部分.

在开发这个新活动/片段时,每次进行更改时,我都必须重新编译整个应用程序,启动它并导航到显示新活动/片段的位置.这很乏味并且减慢了整个过程.

有没有办法直接启动当前正在开发的活动/片段?

附录:

许多人建议修改现有代码或清单,以便应用程序首先启动新活动/片段:

必须修改现有代码正是我想要避免的.这对我来说听起来不对.所以我想我可以为此目的编写一个espresso测试,并直接从中启动活动/片段.问题是espresso仅在测试期间保持活动/片段,因此它在几分之一秒内可见,然后消失.

android

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