小编dav*_*ola的帖子

rxjava:我可以使用retry()但是有延迟吗?

我在我的Android应用程序中使用rxjava来异步处理网络请求.现在我想在一段时间过后才重试失败的网络请求.

有没有办法在Observable上使用retry()但只能在一定延迟后重试?

有没有办法让Observable知道当前正在重试(而不是第一次尝试)?

我看了一下debounce()/ throttleWithTimeout(),但他们似乎做了不同的事情.

编辑:

我想我找到了一种方法,但是我会对确认这是正确的方法或其他更好的方法感兴趣.

我正在做的是:在我的Observable.OnSubscribe的call()方法中,在我调用Subscribers onError()方法之前,我只是让Thread睡眠所需的时间.所以,要每1000毫秒重试一次,我会这样做:

@Override
public void call(Subscriber<? super List<ProductNode>> subscriber) {
    try {
        Log.d(TAG, "trying to load all products with pid: " + pid);
        subscriber.onNext(productClient.getProductNodesForParentId(pid));
        subscriber.onCompleted();
    } catch (Exception e) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e1) {
            e.printStackTrace();
        }
        subscriber.onError(e);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于此方法无论如何都在IO线程上运行,因此它不会阻止UI.我能看到的唯一问题是,即使是第一个错误也会报告延迟,所以即使没有重试(),也会出现延迟.如果延迟没有错误之后应用,而是重试之前(但不是在第一次尝试之前,显然),我会更喜欢它.

rx-java

86
推荐指数
8
解决办法
4万
查看次数

更改LayoutParams对象上的属性后,是否需要再次调用setLayoutParams?

我有一个视图(包含广告),我需要缩放以适应某个时间点(加载广告后)的屏幕宽度.所以我有一个方法setHeight(myView)来计算给定屏幕宽度的正确高度,并相应地更改视图的LayoutParams.代码的关键部分是:

LayoutParams params = myView.getLayoutParams();
int width = myView.getWidth();
if (params != null && width > 0) {
    params.height = (int) Math.round(ratio * width);
}
Run Code Online (Sandbox Code Playgroud)

这似乎在很大程度上起作用,但有时视图不会缩放.如果我在底部添加以下行,似乎只是合理地工作:

myView.setLayoutParams(params);
Run Code Online (Sandbox Code Playgroud)

这似乎也有意义,因为Android Views会调用requestLayout()他们的setLayoutParams()方法.相反,我认为公共字段(params.height)中的更改不会触发布局更改.

另一方面,我反复在网上找到简单更改参数的教程,然后再不再设置视图.

所以,我的问题是:在更改LayoutParams的属性后立即更新布局是否正确,我需要setLayoutParams再次调用?只是更改属性只会导致布局更改在稍后某个时间从其他地方触发布局更改时?

android layoutparams

25
推荐指数
2
解决办法
9065
查看次数

Kotlin:密封类不能"包含"数据类?为什么?

好了,现在科特林正式出来,我开始再次发挥它,我很困惑,我需要的优点之间进行选择sealed,并data以某种方式,但不能兼得.

例如,这似乎对我有意义,但不编译:

sealed class Expr {
    data class Const(val number: Double) : Expr()
    data class Sum(val expr1 : Expr, val expr2 : Expr) : Expr()
}
Run Code Online (Sandbox Code Playgroud)

因为数据类不能扩展其他类.

有什么我想念的吗?

kotlin data-class

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

Android Studio:"框架不可用"?

我正在使用Google的Android电视Leanback库,我正在努力弄清楚如何最好地监听遥控器上的按钮(尤其是那些未被捕获的按钮MediaSession).

出于这个原因,我有一个断点BaseGridView.dispatchTouchEvent(),当我按下其中一个远程按钮时,调试器确实跳到了那一点并向我显示了通常的调试信息.

但是,在几(2-5)秒后,调试信息消失,并被消息"帧不可用"替换.

在其他地方调试器工作正常,所以我想知道调试器引起的延迟是否计为ANR,因此应用程序强制关闭?

无论如何,有没有办法解决这个问题?

android android-debug android-studio

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

Android Studio无法使用Kotlin DSL打开Android项目

我已经将我们的Android项目之一从旧的Groovy settings.gradlebuild.gradle文件转换为新的Kotlin DSL,即settings.gradle.ktsbuild.gradle.kts

尽管“它可以在我的机器上工作”,尤其是:我从Groovy转换为Kotlin的原始项目在其原始目录中运行良好,但所有我的同事在克隆存储库时都无法打开该项目。重要的是,将存储库克隆到其他目录时,我也无法自己打开项目(在同一台计算机上使用相同的AS安装)。因此,我怀疑某些配置文件中缺少一些其他详细信息,但我似乎无法弄清楚哪个...

细节:

  • 当我只使用File > Open...然后选择项目文件夹时,我只会收到错误消息“项目'xxx'不是基于Gradle的项目”
  • 相反,当我依次检查Import Project (Gradle, Eclipse ADT, etc.)然后选择时Import project from external modelAndroid GradleAndroid Studio将创建一个空build.gradle文件并失败,并显示错误消息“错误:未找到ID为'com.android.library'的插件。” 删除build.gradle正义返回到我在第一个项目符号要点中描述的错误消息。

我知道这个Github问题,似乎描述了同样的问题,但是它一直很安静,我想这附近的某人一定想出了解决这个问题的方法...

哦,命令行构建在任何地方都可以工作-这纯粹是一个Android Studio问题。

更新:当我整个项目复制到一个新文件夹(而不是克隆存储库)时,我可以毫无问题地打开它。因此,我是否假设文件夹内必须有东西(但在Git中没有)是正确的呢?

gradle android-studio android-gradle-plugin gradle-kotlin-dsl

8
推荐指数
2
解决办法
950
查看次数

ADB shell:如何获取将接收BOOT_COMPLETED Intent的BroadcastReceiver列表?

我正在调试一个应该在设备启动后自动启动的应用程序.为此我创建了一个BroadcastReceiver并将其添加到我的AndroidManifest.xml:

<receiver android:name=".receiver.StartupBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

这在大多数设备上始终有效.然而,在一台设备(MXQ Pro机顶盒)上,它只能在大部分时间工作.到目前为止,我还没有找到任何模式,当它工作时,它没有.

所以,我想找出哪些BroadcastReceivers实际上是当前在系统中注册的,以接收BOOT_COMPLETED Intent.

我玩了一下

  • pm:但这只告诉我哪些包想要收到Intent
  • dumpsys:但它的输出是压倒性的,我不知道该寻找什么

谢谢你的建议!

android adb android-intent dumpsys adb-shell

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

TabBarView 中的 GestureDetector - 嵌套滚动?

我有一个TabBarView,其中每个选项卡都包含一个Image包裹在 a 中的GestureDetector用于缩放和平移。如果重要的话,这就是我目前实现缩放的方式:如何平移和缩放图像?.

现在我遇到的问题是缩放仅在捏合运动非常垂直时才有效。如果我有点偏离,即使我使用双指,触摸事件也会立即用于滑动到下一个选项卡。而且我认为水平平移根本不起作用。

Flutter 中是否有任何机制允许内部GestureDetector在将某些触摸事件(但不是其他的,并不总是)提供给它们之前拦截它们TabBarView

flutter

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

如何在Kotlin中访问variant.outputFileName

我们一直在使用像这样的代码片段来重命名由Gradle构建生成的APK文件:

android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //developer.android.com/studio/build/gradle-plugin-3-0-0-migration#variant_output

我现在在我的转换的过程中build.gradlebuild.gradle.kts,即到摇篮科特林DSL。这是最后缺少的部分之一:我不知道如何访问outputFileName

根据API文档,它似乎甚至不存在:

  • BaseVariant.getOutputs()返回,DomainObjectCollection<BaseVariantOutput>其中提供all了代码段中使用的方法。
  • BaseVariantOutput扩展OutputFileVariantOutput但没有一个outputFileName具有匹配名称的getter或setter。

因此,我怀疑有一些先进的Groovy魔术可以使它起作用-但是我如何在科特林到达那里?

gradle kotlin android-gradle-plugin gradle-kotlin-dsl

6
推荐指数
3
解决办法
1063
查看次数

基于Bamboo的Android版本在lintVital任务上挂了20多分钟

一段时间以来,我们所有的Android版本(在Bamboo上运行)都在lintVital任务中挂了20多分钟,此时构建通常会被强制停止:

build   28-Jan-2019 09:25:25    > Task :app-bigscreen:lintVitalProdFiretvRelease
build   28-Jan-2019 09:26:36    Calling mockable JAR artifact transform to create file: /appl/bamboo/gradle-home/caches/transforms-2/files-2.1/552f5f21376c4f273769ade73c6fef92/android.jar with input /appl/bamboo/android-sdk-linux/platforms/android-28/android.jar
error   28-Jan-2019 09:47:00    Force Stop build feature is enabled for current plan. Either Bamboo has detected the build has hung or it has been manually stopped.
Run Code Online (Sandbox Code Playgroud)

但是,这只是我们的两个Bamboo构建代理的情况 - 另一方面,相同的构建运行没有任何问题,lintVital任务在一秒钟内完成.(在开发机器上构建也运行正常.)根据我们的Bamboo管理员,两个构建代理的设置是"相同的" - 我还确保Android SDK文件夹是同步的,因为错误之前的行引用了一些Gradle缓存中的文件我也删除了该文件夹,但这也没有任何好处.

所以,我基本上正在寻找任何可能使lintVital任务挂起的提示

或者,更一般地说:lintVital任务是做什么的,它依赖于什么工具或其他输入(除了我们的Git存储库的内容)?

android bamboo gradle android-gradle-plugin

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

如何从SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION中恢复?

这个问题实际上是在更复杂的情况下出现的,涉及方向变化和纵向和横向布局的变化,但是在最小版本中,问题是这样的:

我们想在“常规”和“全屏”布局之间来回切换,即:

  • 一种布局,其中内容仅占据导航栏和状态栏内部的空间
  • 一种布局,内容占据整个屏幕,并在导航栏和状态栏下滑动

要将屏幕从正常模式切换到全屏模式,我们使用:

public static final int EXPAND_FLAGS = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;

getWindow().getDecorView().setSystemUiVisibility(EXPAND_FLAGS);
Run Code Online (Sandbox Code Playgroud)

为了切换回去,我们尝试了:

public static final int SHRINK_FLAGS = View.SYSTEM_UI_FLAG_VISIBLE;

getWindow().getDecorView().setSystemUiVisibility(SHRINK_FLAGS);
Run Code Online (Sandbox Code Playgroud)

所以,从这个

应用启动后的布局

我们首先对此“扩展”:

单击“展开”后的布局

但是“缩小”后部不起作用:

“展开”和“缩小”之后的布局

因此,似乎虽然仅允许Activity在系统UI内进行绘制,但它仍然“认为”它应该为系统UI留出空间。

所以我的问题是:SHRINK_FLAGS上面的代码应该包含什么?或者应该完全不同地做什么?

我们正在使用AppCompatActivity带有Theme.AppCompat.Light.DarkActionBar主题的。

android android-layout android-actionbar-compat android-actionbaractivity

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

颤动:向上移动对话框为软键盘腾出空间?

有没有办法移动一个Dialog(AlertDialog在我的情况下),以便在可见时为软键盘腾出空间?

登录对话框 - 键盘隐藏 登录对话框 - 键盘隐藏文本字段

flutter

5
推荐指数
2
解决办法
3434
查看次数

Google Play 结算:订阅无法进行未决购买?

上下文:我们有一个电视应用程序,它提供每月订阅作为其唯一的应用程序内项目。

我主要是在寻找对我认为是真实的东西的确认:

  • 从 Google Play Billing Library 的 2.0 版开始,就有一种叫做待定购买的东西。主要的实际用例似乎是用户在某些注册商店以现金支付的购买。在应用程序中的初始购买和商店中的现金付款之间的时间内,购买处于待处理状态
  • 为了测试这些待处理的购买,现在应该为许可证测试人员提供两种额外的付款方式,即“慢速测试卡,几分钟后批准”和“慢速测试卡,几分钟后拒绝”。
  • 我的同事和我还没有发现这两个附加试验付款方式, 一些 其他
  • Google 的官方文档指出:“订阅购买无法使用其他付款方式。”
  • 由于挂起购买只能由这些“其他付款方式”(信用卡、Play 商店礼品卡等除外)产生,这意味着订阅项目不会发生挂起购买,这解释了为什么我们都看不到这两种额外付款我们测试中的方法

对或错?

android in-app-subscription play-billing-library google-play-billing

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

此代码如何引发NoWhenBranchMatchedException?

在我们最新的应用程序版本中,我们看到了一些kotlin.NoWhenBranchMatchedException报告给Fabric / Crashlytics的消息。

这是有问题的代码段:

private lateinit var welcome: Welcome

// ...

welcome.welcomeStateLoginStatus.let {
    val handled = when (it) {
        UnknownUser -> {
            btn_login.visibility = View.VISIBLE
            btn_logout.visibility = View.GONE

            secondButtonFocusedInfoText = getString(R.string.welcome_login_button_info)
            tv_user_description.text = null
        }
        is InternalUser -> {
            btn_login.visibility = View.GONE
            btn_logout.visibility = View.VISIBLE

            secondButtonFocusedInfoText = "Logout"
            tv_user_description.text = "Logged in as internal user"
        }
        ExternalUser -> {
            btn_login.visibility = View.GONE
            btn_logout.visibility = View.VISIBLE

            secondButtonFocusedInfoText = "Logout"
            tv_user_description.text = "Logged in as external user"
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

android kotlin sealed-class

3
推荐指数
1
解决办法
960
查看次数