如果我们已经有一个JobScheduler以及一些具有相同功能的漂亮的后端(AndroidJob和FirebaseJobDispatcher),为什么我们需要新的Android WorkManager?它有任何杀戮功能吗?因为我没有看到任何让我想要迁移到另一个调度程序的东西.
假设您正在编写Android项目(而不是库).所有文件都汇编在一起所以... internal在这种情况下使用可见性修饰符有什么意义吗?
给定一个返回模型的API(由Retrofit实现).我将一个老式的Call包含在一个Deferred使用extention函数中:
fun <T> Call<T>.toDeferred(): Deferred<T> {
val deferred = CompletableDeferred<T>()
// cancel request as well
deferred.invokeOnCompletion {
if (deferred.isCancelled) {
cancel()
}
}
enqueue(object : Callback<T> {
override fun onFailure(call: Call<T>?, t: Throwable) {
deferred.completeExceptionally(t)
}
override fun onResponse(call: Call<T>?, response: Response<T>) {
if (response.isSuccessful) {
deferred.complete(response.body()!!)
} else {
deferred.completeExceptionally(HttpException(response))
}
}
})
return deferred
}
Run Code Online (Sandbox Code Playgroud)
现在我可以得到这样的模型:
data class Dummy(val name: String, val age: Int)
fun getDummy(): Deferred<Dummy> = api.getDummy().toDeferred()
Run Code Online (Sandbox Code Playgroud)
但是如何修改里面的对象 …
我想为var属性做一个懒惰的初始化.由于by lazy仅限于val属性我必须写这样的东西:
private var currentContextProvider: ContextProvider? = null
get() {
if (field == null) {
field = DefaultContextProvider()
}
return field
}
Run Code Online (Sandbox Code Playgroud)
现在我必须处理那些毫无意义的可控性通知:currentContextProvider?.getContext()或者说currentContextProvider!!.getContext()
难道我做错了什么?
我有一个RecyclerViewwith GridLayoutManager,其中包含各种ViewTypes(以及SpanSizes )的项目。我需要为所有R.layout.item_image类型圆角,如下图所示
所以我创建了一个ItemDecoration计算Rect这些项目将被绘制的对象。然后将其剪辑Canvas到此Rect(用于Path圆角):
public class RoundCornersDecoration extends RecyclerView.ItemDecoration {
private final float radius;
private final RectF defaultRectToClip;
public RoundCornersDecoration(float radius) {
this.radius = radius;
defaultRectToClip = new RectF(Float.MAX_VALUE, Float.MAX_VALUE, 0, 0);
}
@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
final RectF rectToClip = getRectToClip(parent);
// has no items with ViewType == `R.layout.item_image`
if (rectToClip.equals(defaultRectToClip)) {
return;
} …Run Code Online (Sandbox Code Playgroud) android android-custom-view android-canvas android-view android-recyclerview
我遵循MVP模式+ UseCases与模型层进行交互。这是我要测试的Presenter中的一种方法:
fun loadPreviews() {
launch(UI) {
val items = previewsUseCase.getPreviews() // a suspending function
println("[method] UseCase items: $items")
println("[method] View call")
view.showPreviews(items)
}
}
Run Code Online (Sandbox Code Playgroud)
我简单的BDD测试:
fun <T> givenSuspended(block: suspend () -> T) = BDDMockito.given(runBlocking { block() })
infix fun <T> BDDMockito.BDDMyOngoingStubbing<T>.willReturn(block: () -> T) = willReturn(block())
@Test
fun `load previews`() {
// UseCase and View are mocked in a `setUp` method
val items = listOf<PreviewItem>()
givenSuspended { previewsUseCase.getPreviews() } willReturn { items }
println("[test] before Presenter call")
runBlocking { …Run Code Online (Sandbox Code Playgroud) 我有一个带有ImageView的ConstraintLayout和带链样式的3个链式TextView:spread_inside
<android.support.design.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/space_normal"
android:paddingEnd="@dimen/space_normal"
android:paddingStart="@dimen/space_normal"
android:paddingTop="@dimen/space_big">
<ImageView
android:id="@+id/ivImage"
android:layout_width="@dimen/feed_list_image_size"
android:layout_height="@dimen/feed_list_image_size"
android:layout_marginBottom="@dimen/space_normal"
android:contentDescription="@null"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0"
tools:src="@color/debug_3" />
<TextView
android:id="@+id/tvTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/space_normal"
android:ellipsize="end"
android:maxLines="3"
android:textSize="@dimen/text_size_big"
app:layout_constraintBottom_toTopOf="@+id/tvContent"
app:layout_constraintEnd_toStartOf="@+id/ivImage"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="spread_inside"
app:textAllCaps="true"
tools:text="@tools:sample/lorem" />
<TextView
android:id="@+id/tvContent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/space_big"
android:layout_marginTop="@dimen/space_normal"
android:ellipsize="end"
android:maxLines="4"
android:textColor="@color/gray_600"
android:textSize="@dimen/text_size_normal"
app:layout_constraintBottom_toTopOf="@+id/tvDate"
app:layout_constraintEnd_toEndOf="@+id/tvTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvTitle"
tools:text="@tools:sample/lorem/random" />
<TextView
android:id="@+id/tvDate"
style="@style/AppTheme.ItemFeedList.Date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/space_normal"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvContent"
tools:text="@tools:sample/date/hhmm" />
</android.support.constraint.ConstraintLayout>
</android.support.design.card.MaterialCardView>
Run Code Online (Sandbox Code Playgroud)
这在编辑器中呈现了一个漂亮而灵活的布局:
但有时顶视图被"推"出其约束,因此文本渲染是错误的(剪裁).这很奇怪,因为spread_inside链条样式应该膨胀并缩小中间视图.从布局检查器 …
android android-layout android-constraintlayout constraint-layout-chains
我读过Dart使用自己的DartVM.因此,Flutter可以在开发应用程序和AOT时使用JIT(用于热重载等)将后者构建为"本机"应用程序(.apk/.ipa).
根据两个平台(Android/iOS)的文档:
提前(AOT)编译成本机ARM库
但是,如果应用程序已通过Dalvik/ART运行,Flutter如何在Android上使用自己的DartVM?VM是否已内置到我们的.apk中,因此可以将其发送到真正的Android设备?
如果DartVM没有用于最终版本那么GC的东西呢?Flutter倾向于创建许多短暂的物体,这对于DartVM的Generational GC来说很好,但对于ART来说并不是那么好.