小编Flo*_*sen的帖子

Kotlin中的通用类类型用法

我正在尝试编写一个通用的基本活动,它指定它的ViewModel类型是一个通用参数:

abstract class BaseActivity<T : ViewModel> : AppCompatActivity()
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试为我的ViewModel编写一个惰性初始化属性:

val viewModel by lazy { ViewModelProviders.of(this, getFactory()).get(T) }
Run Code Online (Sandbox Code Playgroud)

显示的错误是 Type Parameter T is not an expression

也使用::class::class.java没有帮助.有谁能解释这个问题?

编辑:我试图使用这样的内联函数:

inline fun <reified T : ViewModel?> AppCompatActivity.obtainViewModel(factory: ViewModelProvider.Factory): T {
    return ViewModelProviders.of(this, factory).get(T::class.java)
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

abstract class BaseActivity<T> : AppCompatActivity() {
    val viewModel by lazy { obtainViewModel<T>(getFactory()) 
}
Run Code Online (Sandbox Code Playgroud)

现在我得到错误,T不能用作具体参数.

EDIT2:到目前为止最好的解决方案似乎是:链接,但它在每个扩展类中实现抽象标记的开销.

generics android kotlin

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

使用通配符订阅 MQTT 主题

我有一个 MQTT 客户端想要订阅以下主题

  1. 节点1/数据/更新
  2. 节点1/数据/增量
  3. 节点1/数据

当然,我有多个节点,所以我必须使用通配符,如下所述: https: //www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/

我尝试了以下主题名称

  1. +/数据/+
  2. +/数据/#
  3. +/data#(我很绝望)

使用上述表达式 1 和 2,我没有收到主题 node1/data 的消息。

有没有办法通过单个订阅来做到这一点?

mqtt hivemq

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

HiveMQ MQTT 客户端 - 重新订阅有关自动重新连接的主题

我在 Spring 中使用 HiveMQ MQTT 客户端来接收 MQTT 消息。

我的客户端配置如下

public Mqtt3AsyncClient mqtt3Client() {
    var mqtt3Client = Mqtt3Client.builder()
            .serverHost("my.host")
            .sslWithDefaultConfig()
            .serverPort(0000)
            .automaticReconnectWithDefaultConfig()
            .buildBlocking();

    mqtt3Client.connect();
    return mqtt3Client.toAsync();
}
Run Code Online (Sandbox Code Playgroud)

客户端可用后,使用该客户端初始化另一个 Spring Bean。它订阅了一个主题:

@PostConstruct
public void subscribeTopic() {
    mqtt3AsyncClient.subscribeWith()
            .topicFilter("topicfilter")
            .qos(MqttQos.AT_LEAST_ONCE)
            .callback(message -> {
                /*Handle message*/
            })
            .send()
            .whenComplete((mqtt3SubAck, throwable) -> {
                if (throwable != null) {
                    /*Logging*/
                } else {
                    /*Logging*/
                }
            });
}

Run Code Online (Sandbox Code Playgroud)

我多次看到没有更多消息传递到我的应用程序,而我仍然能够使用客户端连接发送消息(因此当时它已连接)。

我找不到任何有关 HiveMQ MQTT 客户端如何处理配置的automaticReconnectWithDefaultConfig(). 谁能指出,我创建的订阅是否subscribeTopic()被重新订阅?addSubscription()我还找到了可以更换零件的方法.topicFilter(..).qos(...)。我也找不到任何信息这是否使订阅对连接丢失更具弹性。

我很感激有关该主题的任何信息。

谢谢。

mqtt hivemq

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

从 docker 容器创建 OpenVPN 连接

我有一个简单的 docker 文件

FROM ubuntu:14.04

USER root

RUN apt-get update && sudo apt-get -y install openvpn

COPY . /tmp
Run Code Online (Sandbox Code Playgroud)

在哪里 。包含有关 VPN 连接的所有必要信息(ovpn 文件、ca 文件、用户证书和密钥)。

通过构建并运行容器docker run -it --device=/dev/net/tun,然后更改为 /tmp 目录并执行,sudo openvpn config.ovpn出现以下错误:

Fri Aug 23 06:15:21 2019 ERROR: Cannot ioctl TUNSETIFF tun: Operation not permitted (errno=1)
Run Code Online (Sandbox Code Playgroud)

[编辑] 通过 OpenVPN GUI 启动 .ovpn 配置工作正常。

有什么建议吗?

谢谢。

vpn openvpn docker

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

IntelliJ-Gradle-Kotlin-Micronaut-更改文件不会在“运行”时重新生成类

我在IntelliJ和Gradle v5.3中有一个Kotlin-Micronaut v.1.0.2项目。我正在运行的应用程序例如具有以下控制器:

@Controller("/api/test")
class TestController {

    @Get
    fun helloWorld() = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)

如果我更改了这些代码中的任何一个,例如更改了返回值或添加了另一个REST方法(例如POST),则必要的代码只会在上生成./gradlew clean build。在IntelliJ中单击“运行”将不会为我生成必要的终结点(例如,添加POST终结点并尝试对其进行卷曲时,在清理构建之前会得到“不允许使用方法”)。

你有什么建议吗?

intellij-idea gradle kotlin micronaut

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

标签 统计

hivemq ×2

kotlin ×2

mqtt ×2

android ×1

docker ×1

generics ×1

gradle ×1

intellij-idea ×1

micronaut ×1

openvpn ×1

vpn ×1