小编Mar*_*kus的帖子

像RxJava中的Subject一样排队

我正在寻找一个可以的主题(或类似的东西):

  1. 如果没有订阅者,可以接收项目并将其保留在队列或缓冲区中
  2. 一旦我们有订户,所有物品都被消耗掉并且再也不会被发射
  3. 我可以订阅/取消订阅主题

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)

rx-java

14
推荐指数
1
解决办法
5407
查看次数

使用Volley和Dagger获得Robolectric ShadowApplication时的NPE

在我的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)

android robolectric dagger android-volley

13
推荐指数
1
解决办法
1444
查看次数

恢复活动时恢复PagedListAdapter位置

我一直在试验,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)

但是当恢复我的适配器并传递lastKeyPagedListBuilder我上次看到的内容以及显示的内容时,相当不同.

    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)

悲惨地失败了.欢迎任何建议:)

android android-paging

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

强行关闭后Android相机锁定

我有一个应用程序,我使用设备相机.

现在我只在正常流量下释放相机.

@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

我怎么能确定,相机在任何情况下都会被释放?

android android-camera

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

上面播放的Android Fragment过渡退出动画进入动画

我正在实现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是错误的.

输入片段动画在退出片段动画下方.是否有解决方法来解决这个问题?

android android-animation android-fragments

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

匕首 - 班级没有注射成员

我正在尝试将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示例非常相似.

我有两个模块ActivityModuleApplicationModule.

@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)

android dagger

9
推荐指数
1
解决办法
5978
查看次数

基于构建类型和风格的更好的Dagger依赖注入?

我正在使用aproach为Dagger提供模块,在这个问题的答案中描述Android Customize Workflow for Product Flavors

我们的方法有点不同 - 我们Modulesdebug构建类型src/debug/javarelease构建类型中都有src/release/java.我们的主要模块称为ApplicationModule包括所有其他模块.

Modulesin src/debug/java为调试,日志记录等和覆盖提供了一些自定义行为ApplcationModule.

现在我们需要根据应用程序风格进行自定义行为.

这样做的正确方法是什么?

例如,风味A到C应该提供自定义行为,而风味D到F应该提供基本的默认行为.

到目前为止,我想出了这样的.

  • 所有的风格(不是构建类型)都有相同的类 src/flavorX/java/com.application.FlavorModule
  • 为避免代码重复,只有A到C的风格提供自定义行为,而其他风格完全为空,以便项目可以编译.我的模块提供了默认行为src/main/java

有没有更好的方法来实现这样的结果?因为我不喜欢空src/flavorX/java/com.application.FlavorModule,不喜欢代码重复...

android dagger

8
推荐指数
1
解决办法
3511
查看次数

资源$ NotFoundException drawable-xhdpi来自drawable资源

我正在检查我的错误报告,并且我们不时会从我们的应用程序中获取此错误报告.我不能指出实际问题是什么.这个资源确实存在,大多数设备工作正常,但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)

android android-resources

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

是否可以为ActionBar SubMenu创建自定义视图?

我想用自定义布局或视图创建ActionBar子菜单项.

就像是: ImageView - TextView - ImageView

可以使用自定义布局或视图创建MenuItem,但是我无法通过子菜单实现这一点 - 带有actionLayout的Android子菜单不可见

android actionbarsherlock android-actionbar

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

用Kotlin进行单元测试的Dagger 2

Kotlin博客中有解释如何让Dagger 2与Kotlin合作.

一切都像魅力一样.到目前为止......我无法让它在测试中发挥作用. DaggerTestSomeComponent不是由...生成的TestSomeComponent : SomeComponent.
我尝试了各种组合.包括在测试中创建绝对新组件.依然没有.
有没有解决方法或者我可以提供其他一些细节吗?

kotlin dagger-2

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