小编Sni*_*kow的帖子

让Kotlin警告将灵活/平台类型分配给非null类型?

当从Kotlin调用非可空性注释的Java函数时,我们得到灵活类型的返回值,用感叹号表示,例如String!.

Kotlin默默地允许将这些灵活值分配给正常的非null类型,例如String,这可能在运行时导致NullPointerExceptions.

我更希望得到编译器警告或错误的此类分配.或者,将平台类型视为等效于可空类型(例如String?).

例如,使用此Java代码:

import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

public class NullTest {

    private String maybe() {
        if (SystemClock.elapsedRealtimeNanos() % 2 == 0) {
            return null;
        }
        return "ok";
    }

    public String annotatedNothing()            { return maybe(); }
    @Nullable public String annotatedNullable() { return maybe(); }
    @NonNull  public String annotatedNonNull()  { return "ok"; }

}
Run Code Online (Sandbox Code Playgroud)

...以及以下Kotlin代码,我想在两个新行上看到错误(请参阅注释):

fun testnulls() {
    val obj = NullTest()

    val nullExact: String  = obj.annotatedNullable() // already gives an error
    val …
Run Code Online (Sandbox Code Playgroud)

nullable non-nullable kotlin

26
推荐指数
1
解决办法
682
查看次数

由慢速测量/布局传递引起的片段转换卡顿

我的应用程序有一个项目列表,单击其中一个会带来一个片段,其中包含该项目的详细信息。详细信息包含一个有点复杂的 RecyclerView(许多带有 FlexBoxLayoutManager 的小视图),并且测量/布局过程可能会超过 50 毫秒。

这种延迟会导致应用在片段转换开始时丢掉几帧,从而导致相当明显的“跳跃”。

我看到了一些可能的方法来避免这种情况:

  1. 在转换完成之前不要填​​充 RecyclerView(或使其成为存根)。缺点:用户看到一个半空的片段动画。
  2. 延迟整个过渡,直到新片段被测量和布局。缺点:用户反馈延迟。
  3. 启动列表的退出动画,但延迟进入动画,直到新片段被测量和布局。这就是我想做的。

不幸的是,退出动画必须在主线程上运行,测量/布局也是如此;没有什么比AsyncLayoutInflater测量/布局更好的了,对吧?

那么,真的没有办法实现 #3 吗?如果是这种情况,有没有人有更好的解决方案?

演示应用

此应用程序只要onMeasure()选中“慢速测量”复选框,只需在方法中添加睡眠“。

这是一个屏幕录制- 请注意切换复选框时的区别,它是如何跳转的(最明显的是左侧的文本和旧/新片段之间的右侧边缘)。

主活动.kt

var beSlow = false

class SlowWidget @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextView(context, attrs, defStyleAttr) {
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        if (beSlow) {
            SystemClock.sleep(100)
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
    }
}

class SlowFragment : Fragment() {
    override fun onCreateView(inflater: LayoutInflater, parent: ViewGroup?, state: Bundle?): …
Run Code Online (Sandbox Code Playgroud)

performance animation android android-fragments

5
推荐指数
0
解决办法
575
查看次数