小编Nik*_*nko的帖子

Android WorkManager与JobScheduler

如果我们已经有一个JobScheduler以及一些具有相同功能的漂亮的后端(AndroidJobFirebaseJobDispatcher),为什么我们需要新的Android WorkManager?它有任何杀戮功能吗?因为我没有看到任何让我想要迁移到另一个调度程序的东西.

android android-jobscheduler android-workmanager

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

Android中的Kotlin"内部"​​可见性修饰符

假设您正在编写Android项目(而不是库).所有文件都汇编在一起所以... internal在这种情况下使用可见性修饰符有什么意义吗?

android kotlin

17
推荐指数
2
解决办法
6597
查看次数

RenderThread vs UI线程

来自Android Threads doc:

您不能从工作线程操纵UI - 您必须从UI线程对您的用户界面进行所有操作

所以我相信屏幕上的所有内容都是由UI线程呈现的.但是在Android Lollipop中他们引入了一个RenderThread:

一个名为RenderThread的新系统管理处理线程即使在主UI线程中存在延迟时也能保持动画流畅

它是如何工作的?RenderThread是否使用UI线程在屏幕上呈现动画(具有新属性的视图)?如果是这样,为什么不阻止UI线程

multithreading android

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

修改延期结果

给定一个返回模型的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)

但是如何修改里面的对象 …

coroutine kotlin rx-java2 kotlin-coroutines

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

Kotlin var lazy init

我想为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()

难道我做错了什么?

delegates kotlin

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

圆角 ItemDecoration

我有一个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

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

如何对Kotlin挂起功能进行单元测试

我遵循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)

mvp unit-testing coroutine mockito kotlin

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

View在ConstraintLayout中被推出了约束

我有一个带有ImageViewConstraintLayout和带链样式的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)

这在编辑器中呈现了一个漂亮而灵活的布局:

布局

layout_short_text

但有时顶视图被"推"出其约束,因此文本渲染是错误的(剪裁).这很奇怪,因为spread_inside链条样式应该膨胀并缩小中间视图.从布局检查器 …

android android-layout android-constraintlayout constraint-layout-chains

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

Flutter如何将自己的DartVM用于本机应用程序

我读过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来说并不是那么好.

android dart flutter

2
推荐指数
1
解决办法
306
查看次数