Tag: multithreading

没有AsyncTask,在后台运行线程并更新UI线程

我试图从Kotlin的后台线程更新回收者视图内容。 我没有使用AsyncTask。 这里是我的代码,我想知道是否有比这更好的方法: 在我的MainActivity中,我有ProgressThread作为成员variables。 var progressThread = Thread() 然后在我想要先运行线程的方法中,我正在定义它…就像 progressThread = Thread ( Runnable { kotlin.run { try { while (i <= 100 && !progressThread.isInterrupted) { Thread.sleep(200) //Some Logic runOnUiThread { //this runs in ui thread } i++ } }catch (e:InterruptedException){ progressThread.interrupt() } } }) 之后,我开始在同样的方法 progressThread.start() 并为了阻止它,我有一个听众取消进展,并在该听众的回调,我写道: progressThread.interrupt()

聪明的演员是不可能的,因为…是一个可变的财产,可能已经改变了这个时间

我正在努力获得一个类,它结合了Kotlin列表,集合和地图。 我希望编写isScalar函数,如果对象只包含一个元素并写入,它应该返回true import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap import it.unimi.dsi.fastutil.objects.ReferenceArrayList import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet class Args { var list : ReferenceArrayList? = null var set : ReferenceOpenHashSet? = null var map : Reference2ReferenceOpenHashMap? = null fun isEmpty() : Boolean { return list === null && set === null && map === null } fun isScalar() : Boolean { if(list !== null […]

将Java线程转换为Kotlin

我尝试通过书“通过示例的Android游戏编程”来学习Kotlin。 现在我无法进一步创建线程。 在Java中,一个线程首先被定义为零,后来被sleep()延迟。 由于我仍然是一个新手,我不能根据我的需要定制代码。 这就是我在Kotlin中find线索的解释。 但是我不能付诸实践。 有人可以告诉我如何使用我的例子做到这一点? 我删除了线程的代码行。 public class TDView extends SurfaceView implements Runnable { //Thread related volatile boolean playing; Thread gameThread = null; //Line 29 … private void control() { try { gameThread.sleep(17); //Line 310 } catch (InterruptedException e) { //catch things here } } public void pause() { playing = false; try […]

尽管使用RxJava在另一个线程上订阅,但在使用Google的People API时仍然收到IllegalStateExceptionexception

注意:我使用Kotlin和RxKotlin来实现有用的扩展function。 我正在尝试使用Google的People API获取一些用户数据,并且将所有的AsyncTasks和东西都移植到了RxJava中。 一切工作除了这部分: private fun getGooglePerson(service: PeopleService?, account: GoogleSignInAccount) = Single.just(service?.people() ?.get(“people/me”) ?.setPersonFields(“emailAddresses,birthdays,genders,phoneNumbers”) ?.execute() ?: Person()) // If null, return an empty person (shouldn’t ever be null, though) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribeBy( onError = {/*Do something*/}, onSuccess = {/*Do something*/} ) 具体来说,我得到一个IllegalStateException的消息, Calling this from your main thread can lead to deadlock 。 我感到困惑,因为我的印象是,调用subscribeOn应该将其上下的所有东西(除非一个observeOn遵循它)转移到另一个线程(在这种情况下, Schedulers.io() […]

Kotlin并发性:任何在Lock中运行代码的标准函数?

我一直在寻找一个函数,它需要一个Locktypes的对象,并运行一个代码块来处理锁定和解锁操作。 我会执行它如下: fun T.runLocked(block: () -> Unit) { lock() try { block() } finally { unlock() } } 像这样使用: val l = ReentrantLock() l.runLocked { println(l.isLocked) } println(l.isLocked) //true //false 任何可用的东西? 我只能find不能像这样使用的synchronized函数。

Kotlin Higher Order Function以可变数量的参数作为parameter passing一个函数

在我的应用程序中,我需要使用特定的框架来执行网络调用。 由于每个网络调用需要在单独的线程上执行,我想有一个函数启动新的线程执行调用并返回一个对象。 为此,我尝试使用HigherOrderFunctions,但直到现在我还没有发现如何将函数声明为一个参数,这个参数带有可变数量的参数。 给你一个想法,我想有这样的事情: fun Client.performNetworkCall(calledFunction:(vararg Object)->Object):Object{ Thread(Runnable { calledFunction }).start() //return function results } 但似乎不可能宣布这样的function。 Kotlin有可能吗? 我想避免在我需要执行网络调用时在每个代码中创建新线程。 所以我可以写这样的东西 client.performNetworkCall{ bean.createNewUser(User(“”,””,”Gosia”,”gosiak@gmail.com”,”pass”))} bean是我的界面的对象,它有一个函数createNewUser。 函数createNewUser在服务器上实现,执行后会返回一些结果。 如果我想要做的是不可能使用更高阶的函数,你能给我一个提示,我还能做些什么,像我上面描述的?

并发在Kotlin

我有一个类,有一个可写的多个线程,类似的variables class A { var s: String? = null //var accessed by multiple threads fun doStuff() { if (s != null) { //not safe } } } 为了解决这个问题,我通常会像这样做一个不可变的副本 class A { var s: String? = null //var accessed by multiple threads fun doStuff() { val sCopy = s if (sCopy != null) { //safe now […]

RxJava和Kotlin数据类copy()操作中的线程切换成本

我的问题是关于操作的成本,特别是Kotlin 数据类 copy()操作和RxJava observeOn()线程切换的成本。 我有一个系统产生的事件,让我们说Schedulers.mainThread 。 事件是Kotlin 数据类 。 接下来是业务逻辑,最后链通过copy()操作产生新的数据类 。 所有结果都必须在Schedulers.mainThread 。 所以,一条连锁店会是这样的: eventSource() //Events are produced on Schedulers.mainThread .observeOn(Schedulers.computation) .map { event -> other business logic event.copy(…) } .observeOn(Schedulers.mainThread) .subscribe(eventConsumer) 因此,如果事件类有15个字段,那么这个问题是值得通过observeOn来切换调度observeOn ,例如copy() 。 应该提到的是, Schedulers.mainThread是用于渲染UI的线程,最好是空置的。

如何限制kotlin协同程序的最大并发性

我有一个序列(从File.walkTopDown),我需要在他们每个人上运行一个长时间运行的操作。 我想使用Kotlin的最佳实践/协同程序,但是我要么没有并行性,要么太多的并行性,并打“太多打开的文件”IO错误。 File(“/Users/me/Pictures/”).walkTopDown() .onFail { file, ex -> println(“ERROR: $file caused $ex”) } .filter { … only big images… } .map { file -> async { // I *think* I want async and not “launch”… ImageProcessor.fromFile(file) } } 这似乎并不是并行运行,而我的多核CPU从来没有超过1 CPU的价值。 有没有一种方法与协程运行“NumberOfCores并行操作”价值的延期工作? 我使用Kotlin Coroutines来查看multithreading ,首先创建所有作业然后加入它们,但这意味着完成序列/文件树遍历繁重的处理加入步骤之前,似乎… iffy! 将其拆分成一个收集和一个流程步骤意味着收集可以在处理之前运行。 val jobs = … the Sequence above… .toSet() println(“Found […]

Kotlin协程的使用

我有房子模拟哪里是各种types的设备。 这些设备在一段时间后会产生事件。 所以我决定每当设备(洗衣机)在做一些阻塞一段时间(例如2分钟)的事情(洗衣服)时使用新的线程,所以主线程不被阻塞。 这个线程只在这段时间(2分钟)睡觉,然后回调洗涤完成。 Kotlin的这个公寓可以使用吗? 会更好吗?