这是关于如何存储@Singleton作用域Dagger 2组件的第N个问题,其寿命应该等于应用程序的生命周期.
在使用Dagger 2的Android应用程序中,通常至少有一个组件是@Singleton作用域,并且应该持续所有应用程序的生命周期:由于这些要求,它通常被初始化并存储在自定义Application类中.
由于我们的应用程序的所有部分都必须可以访问此Component的实例,因此我看到过这样的代码:
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)
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)
public class App extends Application {
private AppComponent appComponent;
@Override
public void onCreate() { …Run Code Online (Sandbox Code Playgroud) 是否可以向现有Okhttp实例添加/删除身份验证器和/或拦截器?如果是,如何?
我正在使用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应用程序中尝试Realm.io,为了保持安全,我想抽象数据库层,以便在需要时我可以切换回基于标准SQLite的数据库而无需重写大多数应用程序.
然而,由于它的特殊性,我发现很难正确地抽象Realm:
我已经使用最近的Realm.copyFromRealm()API而不是传递绑定到Realm的RealmObjects来解决这些限制,但这种方式我认为我正在失去使用领域的所有好处(我呢?).
有什么建议?
我想编写一个仪器测试来验证使用 API23+ 上的 FusedLocation API 请求位置更新的应用程序的行为。
我有一些要求:
由于需要在模拟设备上进行测试,因此我们必须使用 FusedLocation.setMockLocation() 来获取位置,否则 requestLocationUpdates() 将不会产生任何结果。
到目前为止,我遇到了这些问题:
在我看来,我已经走进了死胡同。请证明我错了!
老实说,我无法理解所有这些关于Android的MVP和类似的东西:它的真正意义何在?
到目前为止,我看到在Android中使用MVP的唯一实际原因是从框架类(即活动,服务,碎片......)中"提取"可单元测试的代码片段,否则这些代码将很难(或不可能)进行测试.
这很好但是这样活动(和其他框架类)最终会在可能的情况下(即处理框架不可知代码时)将工作委托给演示者,并在不处理时直接进行工作.因为这个演示者最终看起来很奇怪,因为它有一些镜像Activity生命周期的方法(onStart,onResume,clickListeners ......).我想知道这是不是代码味?
最重要的是,我看到大量的库/模式来构建MVP Android应用程序,但老实说,我没有看到它们真正的好处:让每个Activity手动创建和管理自己的演示者有什么缺点?我认为将Activity和Presenter相互分离没有任何好处,因为演示者只是从Activity中"提取"某些代码,它将根据定义与它紧密耦合,只要主持人这听起来就很好.仅包含严格的表示逻辑(业务逻辑的其余部分将进入专用类,这些类对View/Presenter二人组不了解).
我对这个话题感到有些迷茫,我想就此事提出一些其他意见,以获得更大的视角.
有时您必须向现有应用程序添加新活动/片段.可以嵌套此活动/片段,以便为了访问它,用户必须打开应用程序并在到达之前浏览UI的多个部分.
在开发这个新活动/片段时,每次进行更改时,我都必须重新编译整个应用程序,启动它并导航到显示新活动/片段的位置.这很乏味并且减慢了整个过程.
有没有办法直接启动当前正在开发的活动/片段?
附录:
许多人建议修改现有代码或清单,以便应用程序首先启动新活动/片段:
必须修改现有代码正是我想要避免的.这对我来说听起来不对.所以我想我可以为此目的编写一个espresso测试,并直接从中启动活动/片段.问题是espresso仅在测试期间保持活动/片段,因此它在几分之一秒内可见,然后消失.
android ×6
java ×2
abstraction ×1
dagger-2 ×1
interceptor ×1
mvp ×1
okhttp ×1
realm ×1
testing ×1