用Kotlin在Android中线程安全的全局资源

我是新来的Android应用程序和活动lifecyle似乎强制对全局的依赖。 (即使有Dagger,也有执行dependency injection的有状态的全局Dagger对象。) 我想创建一个名为GlobalMode的全局可用模式对象。 该模式应该在运行时改变。 这是我迄今为止: interface Mode { fun doSomething(a: Int); } class NormalMode : Mode { override fun doSomething(a: Int) { // … } } class DebugMode : Mode { override fun doSomething(a: Int) { // … } } object GlobalMode : Mode { private var mode: Mode? = null; private fun getMode() […]

Android Studio构建失败,Kotlin

:app:mergeDebugAssets :app:processDebugJavaRes UP-TO-DATE :app:transformResourcesWithMergeJavaResForDebug FAILED FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ‘:app:transformResourcesWithMergeJavaResForDebug’. > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK kotlin/internal/internal.kotlin_builtins File1: /Users/KD/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable/1.0.4/172b43fbc03b521fed141484b212d6725fa671a9/kotlin-compiler-embeddable-1.0.4.jar File2: /Users/KD/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-runtime/1.0.4/8e25da5e31669f5acf514bdd99b94ff5c7003b3b/kotlin-runtime-1.0.4.jar 我的build.gradle: apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ apply plugin: ‘kotlin-android-extensions’ android { compileSdkVersion 23 buildToolsVersion “23.0.2” defaultConfig { applicationId “com.app2par.ctime” minSdkVersion 16 […]

我如何在Kotlin中为属性的后台字段设置JsName?

我在1.0.x中玩过Kotlin不支持的JavaScript后端,现在正在尝试将我的玩具项目迁移到1.1.x. 这是一个与PouchDB接口的单页Web应用程序的最基本的骨骼。 要将数据添加到PouchDB,您需要具有特定属性_id和_rev JavaScript对象。 他们也不需要以_开始的任何其他属性,因为它们是由PouchDB保留的。 现在,如果我创建一个这样的类,我可以发送实例到PouchDB。 class PouchDoc( var _id: String ) { var _rev: String? = null } 但是,如果我做任何事情来使属性虚拟 – 让他们重写一个接口,或打开类,并创建一个覆盖它们的子类 – _id字段名称变成类似于_id_mmz446$_0 ,所以PouchDB拒绝目的。 如果我将@JsName(“_id”)到属性,只影响生成的getter和setter – 它仍然留下一个损坏的名称的支持字段。 而且,对于名称不以_开头的虚拟属性,PouchDB将接受该对象,但它只存储带有错误名称的支持字段,而不是名称正确的属性。 现在我可以通过使它们不是虚拟的来解决问题。 但是我正在考虑在Kotlin中分享PouchDoc和非PouchDoc类之间的接口,而且我似乎无法做到这一点。 任何想法我可以做这个工作,还是需要Kotlin语言改变?

有没有办法来注释kotlin对象的INSTANCE字段?

我有一个Kotlin对象,有几个字段暴露为静态@JvmFields 。 我使用的解析器(我无法编辑或更改)查找public static字段并基于这些创建配置文件。 由于INSTANCE字段也是公共的,因此解析器将生成一个名为instance的新类别。 有没有办法将实际的注释添加到INSTANCE字段? 我想将@Ingore注释添加到它,所以解析器不使用INSTANCE字段。

Kotlin readBytes()永远不会完成

我只是试图通过蓝牙套接字来读写,但是我的readBytes调用没有完成。 我认为这是非常简单的,但也许我只是使用错误types的流或东西。 截至目前我的代码只是发送少量的文字作为字节。 这是占位符代码,将被替换为通过流写入和读取文件的代码。 这是我的接收线程: class ReceiveThread(val inStream:BufferedInputStream):Thread() { var bytes:ByteArray? = null override fun run() { BluetoothService.log(“Begin ${BTS_Constants.THREAD_RECEIVE}”) BluetoothService.log(“preparing to read data”) name = BTS_Constants.THREAD_RECEIVE //here is my new code inStream.use { do{ count++ BluetoothService.log(“read loop round $count”) byteList.add(it.read() as Byte) }while (it.available()>0) } BluetoothService.log(“data read: ${byteList.get(0) as Char}”) } } 这是我的发送主题: class SendThread(val […]

在Kotlin嵌套多重声明

假设我有一个Map<String,Pair> 。 我可以直接遍历所有三个子元素使用某种嵌套的多声明? for ((key, (k, v)) in map) 和 for ((key, k, v) in map) 似乎没有工作。

无法在build.gradle中添加一个kotlin项目的mysql连接器?

我想在Kotlin做一个简单的例子POC我想在build.gradle中添加MySQL连接器所以我已经添加到这一行 dependencies {compile “mysql:mysql-connector-java:5.1.4”} 在build.gradle,当我尝试运行我的项目我收到一些错误 Error:Execution failed for task ‘:app:transformResourcesWithMergeJavaResForDebug’. com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK com/mysql/jdbc/configs/maxPerformance.properties File1: /opt/android/playGround/AndroidStudioProjects/app/libs/mysql-connector-java-5.1.4.jar File2: /home/cruz/.gradle/caches/modules-2/files-2.1/mysql/mysql-connector-java/5.1.4/a60e0a6de16ad99bcd1aa954034b825ddc0b5ebf/mysql-connector-java-5.1.4.jar maxPerformance.properties cachePrepStmts=true cacheCallableStatements=true cacheServerConfiguration=true useLocalSessionState=true elideSetAutoCommits=true alwaysSendSetIsolation=false enableQueryTimeouts=false 我的项目结构如图所示

Kotlin Twitter Outh-Signature

我试图得到一个有效的oaut签名,但我无法做到这一点。 我在网上搜索了一段时间,发现了一些有用的网站,但即使有90%的代码,它不工作。 我已经有了消费者密码,消费者密码,访问令牌和令牌密码。 我创建了我已经拥有的所有参数(NameValuePair)的列表,并在我对它们中的每一个进行百分比编码之后,通过键对它们进行排序。 然后我建立基本上是百分比编码的汇总的签名基本字符串。 随着消费者的秘密和令牌的秘密也编码和合并与他们之间的“&”我扔在HMAC-SHA1函数签名基础字符串和新创建的密钥混合字符串。 该函数的结果是一个byteArray,然后转换为一个字符串并用作oauth_signature。 但它没有工作。 我不能进一步调试,因为我刚开始一个HTTP请求后得到一个401 HTTP错误授权请求。 有什么建议么 ? private fun generateNonce(): String { val random = Random() return java.lang.Long.toString(Math.abs(random.nextLong())) + System.currentTimeMillis() } private fun generateSignature(signatueBaseStr: String, oAuthConsumerSecret: String, oAuthTokenSecret: String?): String { var byteHMAC: ByteArray? = null try { val mac = Mac.getInstance(“HmacSHA1”) val spec: SecretKeySpec spec = if (null == […]

Kotlin – “in”关键字 – 用于什么?

我想了解什么时候在generics中使用“in”关键字,而不是“out”关键字(它允许分配给子类)。 如果它很重要,我实际上是按照这个教程 。 可以说我们有以下的类定义: class ParameterizedConsumer { fun toString(value: T): String { return value.toString() } } 这是如何编译的,因为值不能保证是一个字符串? 这是什么in关键字呢? 它告诉类有一个保证types不会是任何其他的子类? 我只是不清楚它的用途,你能帮忙吗? 该教程说,我将能够呼叫以下,但我失去了什么改变了: val parameterizedConsumer = ParameterizedConsumer() val ref: ParameterizedConsumer = parameterizedConsumer assertTrue(ref is ParameterizedConsumer) 更新:我现在得到它。 意味着你可以在生产时沮丧。 和“在”意味着你可以在分配时倒立。 所以在Java中这是不允许的: // Java void demo(Source strs) { Source objects = strs; // !!! Not allowed in Java // … […]

Java / Kotlingenerics

我有一个模板/generics的问题。 这是我目前的代码 data class RealmWatcher( val results: RealmResults, val handler: (RealmResults) -> Unit) 然后在Android片段中使用它来侦听特定的结果并根据更改执行操作。 所以我们以此为例 private val realmListener = arrayOf( RealmWatcher(Realm.getDefaultInstance().where(Notification::class.java).equalTo(“isNew”, true).findAll(), { n: RealmResults -> // DO STUFF }) 我正在做这个片段的开始/停止 override fun onResume() { super.onResume() // start listening and execute realmListener.forEach { it.handler(it.results) } realmListener.forEach { it.results.addChangeListener(it.handler) } } override fun onPause() { // […]