我在我的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.我能看到的唯一问题是,即使是第一个错误也会报告延迟,所以即使没有重试(),也会出现延迟.如果延迟没有在错误之后应用,而是在重试之前(但不是在第一次尝试之前,显然),我会更喜欢它.
我有一个视图(包含广告),我需要缩放以适应某个时间点(加载广告后)的屏幕宽度.所以我有一个方法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再次调用?只是更改属性只会导致布局更改在稍后某个时间从其他地方触发布局更改时?
好了,现在科特林正式出来,我开始再次发挥它,我很困惑,我需要的优点之间进行选择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)
因为数据类不能扩展其他类.
有什么我想念的吗?
我正在使用Google的Android电视Leanback库,我正在努力弄清楚如何最好地监听遥控器上的按钮(尤其是那些未被捕获的按钮MediaSession).
出于这个原因,我有一个断点BaseGridView.dispatchTouchEvent(),当我按下其中一个远程按钮时,调试器确实跳到了那一点并向我显示了通常的调试信息.
但是,在几(2-5)秒后,调试信息消失,并被消息"帧不可用"替换.
在其他地方调试器工作正常,所以我想知道调试器引起的延迟是否计为ANR,因此应用程序强制关闭?
无论如何,有没有办法解决这个问题?
我已经将我们的Android项目之一从旧的Groovy settings.gradle和build.gradle文件转换为新的Kotlin DSL,即settings.gradle.kts和build.gradle.kts。
尽管“它可以在我的机器上工作”,尤其是:我从Groovy转换为Kotlin的原始项目在其原始目录中运行良好,但所有我的同事在克隆存储库时都无法打开该项目。重要的是,将存储库克隆到其他目录时,我也无法自己打开项目(在同一台计算机上使用相同的AS安装)。因此,我怀疑某些配置文件中缺少一些其他详细信息,但我似乎无法弄清楚哪个...
细节:
File > Open...然后选择项目文件夹时,我只会收到错误消息“项目'xxx'不是基于Gradle的项目”Import Project (Gradle, Eclipse ADT, etc.)然后选择时Import project from external model,Android GradleAndroid Studio将创建一个空build.gradle文件并失败,并显示错误消息“错误:未找到ID为'com.android.library'的插件。” 删除build.gradle正义返回到我在第一个项目符号要点中描述的错误消息。我知道这个Github问题,似乎描述了同样的问题,但是它一直很安静,我想这附近的某人一定想出了解决这个问题的方法...
哦,命令行构建在任何地方都可以工作-这纯粹是一个Android Studio问题。
更新:当我将整个项目复制到一个新文件夹(而不是克隆存储库)时,我可以毫无问题地打开它。因此,我是否假设文件夹内必须有东西(但在Git中没有)是正确的呢?
gradle android-studio android-gradle-plugin gradle-kotlin-dsl
我正在调试一个应该在设备启动后自动启动的应用程序.为此我创建了一个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:但这只告诉我哪些包想要收到Intentdumpsys:但它的输出是压倒性的,我不知道该寻找什么谢谢你的建议!
我有一个TabBarView,其中每个选项卡都包含一个Image包裹在 a 中的GestureDetector用于缩放和平移。如果重要的话,这就是我目前实现缩放的方式:如何平移和缩放图像?.
现在我遇到的问题是缩放仅在捏合运动非常垂直时才有效。如果我有点偏离,即使我使用双指,触摸事件也会立即用于滑动到下一个选项卡。而且我认为水平平移根本不起作用。
Flutter 中是否有任何机制允许内部GestureDetector在将某些触摸事件(但不是其他的,并不总是)提供给它们之前拦截它们TabBarView?
我们一直在使用像这样的代码片段来重命名由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.gradle来build.gradle.kts,即到摇篮科特林DSL。这是最后缺少的部分之一:我不知道如何访问outputFileName。
根据API文档,它似乎甚至不存在:
BaseVariant.getOutputs()返回,DomainObjectCollection<BaseVariantOutput>其中提供all了代码段中使用的方法。BaseVariantOutput扩展OutputFile,VariantOutput但没有一个outputFileName具有匹配名称的getter或setter。因此,我怀疑有一些先进的Groovy魔术可以使它起作用-但是我如何在科特林到达那里?
一段时间以来,我们所有的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存储库的内容)?
这个问题实际上是在更复杂的情况下出现的,涉及方向变化和纵向和横向布局的变化,但是在最小版本中,问题是这样的:
我们想在“常规”和“全屏”布局之间来回切换,即:
要将屏幕从正常模式切换到全屏模式,我们使用:
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
上下文:我们有一个电视应用程序,它提供每月订阅作为其唯一的应用程序内项目。
我主要是在寻找对我认为是真实的东西的确认:
对或错?
android in-app-subscription play-billing-library google-play-billing
在我们最新的应用程序版本中,我们看到了一些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 ×7
gradle ×3
kotlin ×3
flutter ×2
adb ×1
adb-shell ×1
bamboo ×1
data-class ×1
dumpsys ×1
layoutparams ×1
rx-java ×1
sealed-class ×1