当从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) 我的应用程序有一个项目列表,单击其中一个会带来一个片段,其中包含该项目的详细信息。详细信息包含一个有点复杂的 RecyclerView(许多带有 FlexBoxLayoutManager 的小视图),并且测量/布局过程可能会超过 50 毫秒。
这种延迟会导致应用在片段转换开始时丢掉几帧,从而导致相当明显的“跳跃”。
我看到了一些可能的方法来避免这种情况:
不幸的是,退出动画必须在主线程上运行,测量/布局也是如此;没有什么比AsyncLayoutInflater测量/布局更好的了,对吧?
那么,真的没有办法实现 #3 吗?如果是这种情况,有没有人有更好的解决方案?
此应用程序只要onMeasure()选中“慢速测量”复选框,只需在方法中添加睡眠“。
这是一个屏幕录制- 请注意切换复选框时的区别,它是如何跳转的(最明显的是左侧的文本和旧/新片段之间的右侧边缘)。
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)