小编And*_*lli的帖子

Kotlin suspend 修饰符更改函数签名,但编译器报告重载错误

介绍

给定两个函数,foo()and foo(),第一个是标准的,第二个是可暂停的

fun foo(x: Int): Int {
    return 2*x
}

suspend fun foo(x: Int): Int {
    return 4*x
}
Run Code Online (Sandbox Code Playgroud)

以下代码无法编译,因为具有相同签名的两个函数存在冲突。

冲突重载:public fun foo(x: Int): Int 在文件 t.kt 中定义,public suspend fun foo(x: Int): Int 在文件 t.kt 中定义

暂停功能

如果我对挂起函数的理解是正确的,那么:

  1. 一个Continuation参数被添加到挂起函数中,状态机使用它来停止和启动挂起代码
  2. 挂起标记函数在后台使用的返回类型是Any(因此Object对于 java)

这两个副作用理论上应该足以改变第二个foo()函数签名,因此以不同于第一个的方式看待挂起标记的函数。

分析

起初,我认为函数签名检查可以在实际将代码编译成字节码之前进行。然而,将两个呈现的函数变成实际的字节码实际上会导致 2 个具有 2 个不同签名的方法。

Java:t.kt -> t.decompiled.java

@Metadata(
    mv = {1, 1, 16},
    bv = {1, 0, 3},
    k = 2,
    d1 …
Run Code Online (Sandbox Code Playgroud)

bytecode suspend kotlin kotlin-coroutines

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

在Android中调整布局的动态大小

在具有大量组件的Activity中,我有一个包含WebView的RelativeLayout(它只显示一个TextView,我不知道它的大小).

这是xml代码:

<RelativeLayout android:id="@+id/descripcionRelative" android:layout_below="@+id/descripcion_bold" android:layout_width="match_parent" android:layout_height="125dip" android:background="@drawable/my_border">
    <WebView android:id="@+id/webViewDescripcion" android:layout_width="wrap_content" android:layout_height="wrap_content"/>      
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

RelativeLayout的属性android:layout_height是125dip,因为如果文本太大,我想划分到125dip.如果文字很大,我会看到带滚动的文字.大!

但是......如果文字很短,我会看到很多不必要的空间.

一个解决方案是将RelativeLayout的android:layout_height更改为wrap_content.如果文本很短,则组件将具有精确的像素,但如果文本太大,我无法对其进行分隔.

BIG PROBLEM是我无法计算WebView的高度.如果我这样做:descripcion_web.getHeight()它返回0.

如果我在这里调用此方法,它不会返回正确的数字:

descripcion_web.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView webView, String url) {
            super.onPageFinished(webView, url);
            RelativeLayout marco = (RelativeLayout)findViewById(R.id.descripcionRelative);
            System.out.println("Height webView: "+webView.getHeight());   
            System.out.println("Height relative: "+marco.getHeight());            
        }           
    });
Run Code Online (Sandbox Code Playgroud)

我尝试在onResume()中的方法中调用它,但它不起作用.

另一个解决问题的尝试是将android:layout_height设置为match_parent并使用View方法setMaximumHeight(),但它不存在.但是,它确实存在setMinimumHeight()...

我该如何解决这个问题?非常感谢你!

size android webview relativelayout

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

Kotlin !! 操作员使用使代码不清晰

我正在写一个Kotlin应用程序,我一直在研究这种语言,我注意到要创建一个变量,你必须明确定义它是否为null然后你使用?运营商.

现在,我的问题.有时我必须定义一个全局变量(在这种情况下是一个片段),所以我需要将它设为null,因为我还不能初始化它

在java中我没有这个问题,因为在声明它之后我做的第一件事是在onCreate()中初始化像这样

TurboFragment fragment = null;

@Override
public void onCreate(Bundle savedInstanceState) {

    ...

    fragment = adapter.getCurrentFragment();
}
Run Code Online (Sandbox Code Playgroud)

然后我可以在没有语法问题的情况下使用它在Kotlin中是不同的,因为我必须这样做

private var fragment: TurboFragment? = null

override fun onCreate(savedInstanceState: Bundle?) {

    ...

    fragment = adapter!!.currentFragment
    fragment!!.foo()
    var x = fragment!!.sampleInt
}
Run Code Online (Sandbox Code Playgroud)

现在,每次我调用片段的实例时我都必须使用null-safe !! 运营商.这使我的代码变得混乱,因为对于每一行,我至少有一个!运算符,它看起来真的不清楚它是否如此频繁,特别是如果你有5个或更多这样的变量.有没有办法简化代码或这种语言的性质是这样的?

null android kotlin kotlin-null-safety

4
推荐指数
1
解决办法
106
查看次数

带有 gradle 构建的 Kotlin 警告

自从我开始将项目从 java 转换为 kotlin 以来,我一直在 Mac 上遇到构建性能问题。

我在 Android Studio 3.0.1 中使用 gradle

问题是,当我构建/运行/编译源代码时,我从 gradle 控制台收到很多关于代码命名约定的警告,让我向您展示

我认为这会减慢我的构建速度。我还尝试稍微调整一下我的 gradle 配置文件并构建脚本,但什么也没发生

org.gradle.daemon=true
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
Run Code Online (Sandbox Code Playgroud)

而且在我的 build.gradle 顶部

tasks.whenTaskAdded { task ->
    if (task.name == "lint" || task.name == "lintVitalRelease") {
        task.enabled = false
    }
}
Run Code Online (Sandbox Code Playgroud)

...

lintOptions {
    checkAllWarnings false
    checkReleaseBuilds false
    ignoreWarnings true       // false by default
    quiet true                // false by default
    tasks.lint.enabled = false
}
Run Code Online (Sandbox Code Playgroud)

我将编译器参数设置为-x lint,所以我对这个错误感到惊讶有人有同样的问题吗?

java android gradle kotlin

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

有什么区别!!和 ?在 kotlin 的空安全中?

我对以下实例中?和的用法有点困惑。!!

  lat = mLastLocation?.latitude.toString()
  longi = mLastLocation!!.longitude.toString()
Run Code Online (Sandbox Code Playgroud)

我应该使用哪个空安全运算符?

android kotlin kotlin-null-safety

0
推荐指数
1
解决办法
2737
查看次数