我正在寻找一个可以的主题(或类似的东西):
BehaviorSubject 几乎可以完成这项工作,但它保留了最后观察到的项目.
UPDATE
基于已接受的答案,我为单个观察项目制定了类似的解决方案.还添加了取消订阅部分以避免内存泄漏.
class LastEventObservable private constructor(
private val onSubscribe: OnSubscribe<Any>,
private val state: State
) : Observable<Any>(onSubscribe) {
fun emit(value: Any) {
if (state.subscriber.hasObservers()) {
state.subscriber.onNext(value)
} else {
state.lastItem = value
}
}
companion object {
fun create(): LastEventObservable {
val state = State()
val onSubscribe = OnSubscribe<Any> { subscriber ->
just(state.lastItem)
.filter { it != null }
.doOnNext { subscriber.onNext(it) }
.doOnCompleted { state.lastItem = null }
.subscribe()
val subscription = state.subscriber.subscribe(subscriber) …Run Code Online (Sandbox Code Playgroud) 在我的Android应用程序中,我设置了Volley.
Robolectric.application已初始化,所有其他测试均可顺利运行.尝试获取模拟HTTP响应时出现此错误.
这是我的测试:
@RunWith(MyRobolectricTestRunner.class)
public class ApiTests {
@Inject
protected Api api;
@Before
public void setUp() {
ObjectGraph.create(new AndroidModule(Robolectric.application), new TestApplicationModule()).inject(this);
}
@Test
public void shouldGetErrorList() throws Exception {
Project project = new Project("test", "test", "test", DateTime.now());
addPendingProjectsErrorsResponse("response.json"); //adding response to FakeHttpLayer
api.getProjectErrors(project, new Listener<ProjectErrors>() {
@Override
public void onResponse(ProjectErrors response) {
assertNotNull(response);
}
}, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
throw new RuntimeException(error);
}
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
Exception in thread "Thread-3" java.lang.NullPointerException
at org.robolectric.shadows.ShadowLooper.getMainLooper(ShadowLooper.java:59) …Run Code Online (Sandbox Code Playgroud) 我一直在试验,PagedListAdapter无法弄清楚如何正确恢复适配器位置.
最后一次尝试是lastKey从当前列表中保存.
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
val lastKey = adapter.currentList?.lastKey as Int
outState.putInt("lastKey", lastKey)
}
Run Code Online (Sandbox Code Playgroud)
但是当恢复我的适配器并传递lastKey给PagedListBuilder我上次看到的内容以及显示的内容时,相当不同.
val dataSourceFactory = dao.reportsDataSourceFactory()
val builder = RxPagedListBuilder(
dataSourceFactory,
PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setInitialLoadSizeHint(60)
.setPageSize(20)
.setPrefetchDistance(60)
.build()
)
.setInitialLoadKey(initialLoadKey)
.setBoundaryCallback(boundaryCallback)
Run Code Online (Sandbox Code Playgroud)
如果我在恢复时位于第4页的中间位置 - 适配器将位于第4页开头的位置.理想情况下,适配器应该恢复到与上次看到的完全相同的位置.
各种尝试保存LayoutManager状态
outState.putParcelable("layout_manager_state", recycler_view.layoutManager.onSaveInstanceState())
Run Code Online (Sandbox Code Playgroud)
然后恢复它
recycler_view.layoutManager.onRestoreInstanceState(it.getParcelable("layout_manager_state"))
Run Code Online (Sandbox Code Playgroud)
悲惨地失败了.欢迎任何建议:)
我有一个应用程序,我使用设备相机.
现在我只在正常流量下释放相机.
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
if(camera != null) {
camera.stopPreview();
camera.release();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,应用程序以意外的方式退出相机模式 - 即强制关闭(由于OutOfMemoryError) - 相机被锁定.释放它的唯一方法是重启设备.
申请开始后,我得到:
RuntimeException: Fail to connect to camera service
我怎么能确定,相机在任何情况下都会被释放?
我正在实现Fragment过渡动画.
我的exit动画是
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together">
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.95"
android:duration="300"/>
<objectAnimator
android:propertyName="scaleY"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.95"
android:duration="300"/>
<objectAnimator
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="0"
android:valueTo="10dp"
android:duration="300"/>
</set>
Run Code Online (Sandbox Code Playgroud)
enter 动画是:
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="x"
android:valueType="floatType"
android:valueFrom="1280"
android:valueTo="0"
android:duration="400"/>
Run Code Online (Sandbox Code Playgroud)
事务创建如下:
fragmentManager.beginTransaction()
.setCustomAnimations(enter, exit, popEnter, popExit)
.replace(CONTENT_CONTAINER_ID, newFragment)
.addToBackStack(null)
.commit();
Run Code Online (Sandbox Code Playgroud)
在正常的动画速度下,由于动画持续时间较短,不需要的效果几乎不可见,但是,当你放慢速度时,你可以清楚地看到,这z-order是错误的.
输入片段动画在退出片段动画下方.是否有解决方法来解决这个问题?
我正在尝试将Dagger集成到我的应用程序中.我遇到了一个问题.我在运行时收到此错误:
java.lang.IllegalStateException: Errors creating object graph:
com.app.NavigationController has no injectable members. Do you want to add an injectable constructor? required by class com.app.fragments.LoginFragment
Run Code Online (Sandbox Code Playgroud)
我试着寻找其他类似的答案,但到目前为止没有任何帮助我......
与图形构造相关的所有内容都与Android Activity Graphs示例非常相似.
我有两个模块ActivityModule和ApplicationModule.
@Module(
includes = ApplicationModule.class,
injects = {
MainActivity.class,
LoginFragment.class
}
)
public class ActivityModule {
private BaseActivity activity;
public ActivityModule(BaseActivity activity) {
this.activity = activity;
}
@Provides
@Singleton
NavigationController provideNavigation() {
return new NavigationController(activity);
}
}
Run Code Online (Sandbox Code Playgroud)
而另一个
@Module(
injects = {
MainActivity.class,
LoginFragment.class},
complete = false …Run Code Online (Sandbox Code Playgroud) 我正在使用aproach为Dagger提供模块,在这个问题的答案中描述Android Customize Workflow for Product Flavors
我们的方法有点不同 - 我们Modules在debug构建类型src/debug/java和release构建类型中都有src/release/java.我们的主要模块称为ApplicationModule包括所有其他模块.
Modulesin src/debug/java为调试,日志记录等和覆盖提供了一些自定义行为ApplcationModule.
现在我们需要根据应用程序风格进行自定义行为.
这样做的正确方法是什么?
例如,风味A到C应该提供自定义行为,而风味D到F应该提供基本的默认行为.
到目前为止,我想出了这样的.
src/flavorX/java/com.application.FlavorModulesrc/main/java有没有更好的方法来实现这样的结果?因为我不喜欢空src/flavorX/java/com.application.FlavorModule,不喜欢代码重复...
我正在检查我的错误报告,并且我们不时会从我们的应用程序中获取此错误报告.我不能指出实际问题是什么.这个资源确实存在,大多数设备工作正常,但LG-E510或U8815等特定设备无法加载此资源.
有任何想法吗?
android.content.res.Resources$NotFoundException: File res/drawable-xhdpi/action_bar_search_icon.png from drawable resource ID #0x7f02007f
at android.content.res.Resources.loadDrawable(Resources.java:1714)
at android.content.res.Resources.getDrawable(Resources.java:581)
at com.actionbarsherlock.internal.view.menu.MenuItemImpl.getIcon(MenuItemImpl.java:384)
at com.actionbarsherlock.internal.view.menu.ActionMenuItemView.initialize(ActionMenuItemView.java:128)
at com.actionbarsherlock.internal.view.menu.ActionMenuPresenter.bindItemView(ActionMenuPresenter.java:192)
at com.actionbarsherlock.internal.view.menu.BaseMenuPresenter.getItemView(BaseMenuPresenter.java:176)
at com.actionbarsherlock.internal.view.menu.ActionMenuPresenter.getItemView(ActionMenuPresenter.java:178)
Run Code Online (Sandbox Code Playgroud) 我想用自定义布局或视图创建ActionBar子菜单项.
就像是: ImageView - TextView - ImageView
可以使用自定义布局或视图创建MenuItem,但是我无法通过子菜单实现这一点 - 带有actionLayout的Android子菜单不可见
在Kotlin博客中有解释如何让Dagger 2与Kotlin合作.
一切都像魅力一样.到目前为止......我无法让它在测试中发挥作用.
DaggerTestSomeComponent不是由...生成的TestSomeComponent : SomeComponent.
我尝试了各种组合.包括在测试中创建绝对新组件.依然没有.
有没有解决方法或者我可以提供其他一些细节吗?