将用于复制资产文件的java代码转换为Android中的缓存文件夹到Kotlin的最佳实践

我使用这个代码来将Android中的Asset文件复制到缓存文件夹,重点在于它是一个Java代码,我将它转换为Kotlin,但是它看起来更多的是围绕while循环的Java(ish): val file = File(“${cacheDir.path}/$fileName”) val dir = file.parentFile dir.mkdirs() val inputStream = assets.open(fileName) val bufferedOutputStream = BufferedOutputStream(FileOutputStream(file)) val buf = ByteArray(10240) var num = inputStream.read(buf) // Java version: while ((num = fi.read(buf)) > 0) while (num > 0) { bufferedOutputStream.write(buf, 0, num) num = inputStream.read(buf) } bufferedOutputStream.close() inputStream.close() 任何能使Kotlin更为专业的专家。

异步春季启动使用Kotlin无法正常工作

我正在尝试创建一个异步执行操作的Spring服务,并返回一个ListenableFuture 。 我希望在操作失败时触发失败回调 – 我尝试这样做是使用AsyncResult.forExecutionException ,如下所示: @Service open class UserClientService { @Async fun fetchUser(email: String): ListenableFuture { val uri = buildUri(email) val headers = buildHeaders() try { val result = restTemplate.exchange(uri, HttpMethod.GET, HttpEntity(headers), User::class.java) return AsyncResult.forValue(result.body) } catch (e: RestClientException) { return AsyncResult.forExecutionException(e) } } } 入门点: @SpringBootApplication @EnableAsync open class UserProxyApplication fun main(args: Array) […]

集团捕捉

大家好,我正在努力弄清楚如何使用kotlin正则expression式的组捕获的结果,为我的生活在网上找不到任何东西。 我基本上只是想简单地去掉“k” var line = “4353453555k fgafg 4535k” line.replace(“(\\d*)[k]”.toRegex(), “replace with group capture”) 我想要的结果是: 4353453555 fgafg 4535

Kotlin – 使用“懒”与“lateinit”的属性初始化

在Kotlin中,如果您不想在构造函数或类体顶部启动类属性,则基本上有以下两个选项(来自语言参考): 延迟初始化 lazy()是一个函数,它接受一个lambda并返回一个Lazy实例,它可以作为实现一个lazy属性的委托:get()的第一个调用执行传递给lazy()的lambda并记住结果,随后的调用得到()只是返回记忆的结果。 例 public class Hello{ val myLazyString: String by lazy { “Hello” }` } 所以第一个调用和次要的调用,无论它在哪里, myLazyString都会返回“Hello” 延迟初始化 通常,声明为具有非nulltypes的属性必须在构造函数中初始化。 但是,这往往不方便。 例如,属性可以通过dependency injection来初始化,或者在unit testing的设置方法中进行初始化。 在这种情况下,你不能在构造函数中提供一个非null初始值设定项,但是当你引用一个类的内部属性的时候,你还是要避免使用null检查。 要处理这种情况,可以使用lateinit修饰符标记属性: public class MyTest { lateinit var subject: TestSubject @SetUp fun setup() { subject = TestSubject() } @Test fun test() { subject.method() } } 修饰符只能用于在类的主体内声明的var属性(不在主构造函数中),只有当属性没有自定义getter或setter时。 属性的types必须是非空的,并且不能是原始types。 那么,如何正确选择这两个选项,既然他们都能解决同样的问题呢?

RxKotlin使用方法引用collectInto()MutableList

以下代码是我尝试将RxJava示例转换为Kotlin。 它应该收集一串Int到MutableList ,但是我得到了大量的错误。 val all: Single<MutableList> = Observable .range(10, 20) .collectInto(::MutableList, MutableList::add) 错误: Error:(113, 36) Kotlin: Type inference failed: Not enough information to infer parameter T in inline fun MutableList(size: Int, init: (index: Int) -> T): MutableList Please specify it explicitly. Error:(113, 49) Kotlin: One type argument expected for interface MutableList : List, MutableCollection defined […]

如何在Kotlin中声明一个函数作为variables

所以我试图在Kotlin中创建一个监听器。 我只想传递一个将在我的代码中执行的方法。 喜欢这个: override fun setButtonClickListener(listener: (text: String) -> Unit) { this.listener = listener } 但是,当我宣布我的听众,我必须这样声明: private var listener : (text: String) -> Unit = null!! 否则,我的AS会抱怨。 但是这个 !! 在一个空对象接缝很奇怪。 我应该如何声明这个监听器? 谢谢!

如何检测Android应用程序何时进入后台并回到前台

我正在尝试编写一个应用程序,在经过一段时间之后将它带回到前台时执行某些特定的操作。 有没有办法来检测应用程序何时发送到后台或带到前台?

在一个片段上设置LayoutManager

我创建了一个片段,我试图实现一个recyclerView并加载一个列表。 当我尝试设置layoutManager时,问题即将到来 错误: java.lang.NullPointerException:尝试在com.gn.app的空对象引用上调用虚拟方法’void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView $ LayoutManager)’。 Fragments.StationsFragment.onCreateView(StationsFragment.kt:37) 我无法弄清楚什么是错的。 分段: class StationsFragment : Fragment() { companion object { val TAG: String = StationsFragment::class.java.simpleName fun newInstance() = StationsFragment() } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { activity.title = getString(R.string.title_home) val view = inflater?.inflate(R.layout.fragment_stations, container, false) rcViewStations.layoutManager = LinearLayoutManager(activity) val retrofit = Retrofit.Builder() .baseUrl(url) […]

查找片段内部视图的宽度

我想find一个片段的视图的宽度,我已经写了下面的代码 class ExampleFragment : Fragment() { var team1_value = 0 override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { // Inflate the layout for this fragment val v = inflater!!.inflate(R.layout.fragment_queens, container, false) val width = v.layout_team1_picker.width.toFloat() Log.d(“width1″,”width is $width”) return v } 我得到的答案是0.0。 如果我在按钮里面做同样的事情 class ExampleFragment : Fragment() { var team1_value = 0 override […]

我如何复制多个主构造函数?

我不确定Kotlin在这方面的最佳做法是什么。 说我有一个Java类, User有两个字段: username和password 。 它有一个这样的主要构造函数: public User(String username, String password) { this.username = username; this.password = hashPassword(password); } 和ORM的第二个构造函数: public User(String username, String password) { this.username = username; this.password = password; } (加上更多的领域没有显示) 通过这个设置,我可以给大部分代码提供一个友好的面孔,并让ORM通过所有的字段来从数据库中重新创建对象。 我的Kotlin代码有一个主要的构造函数: class User(var username: String, var name: String, password: String) 用一个初始值设定项来调用hashPassword并将其分配给一个私有属性。 我怎样才能正确地构造一个二级构造函数,这样我就不必散列来自数据库的值了?