iLobanov
09/07/2018, 4:40 AMfun someFunction() : SomeResult {
val someObj = SomeObj(SomeListenr { result ->
SomeResult(result) // <- WANT THIS
}
)
someObj.start()
}
gildor
09/07/2018, 4:48 AMiLobanov
09/07/2018, 4:59 AMfun someFunction() : SomeResult {
launch(UI) {
val someObj = SomeObj(SomeListenr { result ->
SomeResult(result) // <- WANT THIS
}
)
someObj.start()
}
return SomeResult from listener
}
uli
09/07/2018, 5:02 AMiLobanov
09/07/2018, 5:03 AMuli
09/07/2018, 5:05 AMiLobanov
09/07/2018, 5:07 AMuli
09/07/2018, 5:08 AMiLobanov
09/07/2018, 5:09 AMgildor
09/07/2018, 5:19 AMiLobanov
09/07/2018, 5:22 AMprivate suspend fun baseFindCamera(): List<SearchSDK.SearchResult> = suspendCoroutine { cont ->
val list: ArrayList<SearchSDK.SearchResult> = ArrayList()
lateinit var searchSDK: SearchSDK
var isResumed = false
val timer = Timer()
var task = timerTask {}
launch(UI) {
searchSDK = SearchSDK(SearchSDK.ISearchResult {
result ->
Log.d(TAG, "searchSDK get result ${result.uid}")
if(!isResumed) {
if (!result.uid.isEmpty())
list.add(result)
else
cont.resumeWithException(NullPointerException())
task.cancel()
task = timerTask {
cont.resume(list)
isResumed = true
timer.cancel()
timer.purge()
searchSDK.stop()
}
timer.schedule(task, 2000)
}
})
searchSDK.search2()
}
}
override fun findCameras(): Either<Failure, List<MyCameraEntity>> {
val emptyCamera = MyCameraEntity("", "", "", "")
val list = runBlocking(CommonPool) { baseFindCamera() }
list.forEach {r ->
Log.d(TAG, "uid ${r.uid} | ip ${r.ip} | port ${r.port} | name ${r.name} | version ${r.version} ")
}
return Either.Right(listOf(emptyCamera))
}
uli
09/07/2018, 2:26 PMlaunch
inside suspendCoroutine
is probably not what you want. Do one thing at a time. Wrap your callback into a coroutine. Then take that coroutine and do other stuff ... schedule to UI thread, stop the sdk, ...gildor
09/08/2018, 2:46 AMuli
09/08/2018, 9:00 AMsearch
function. Your timer task probably reduces to a simple delay:
private suspend fun search(): SearchSDK.SearchResult = suspendCoroutine { cont ->
searchSDK = SearchSDK(SearchSDK.ISearchResult { result ->
if (!result.uid.isEmpty())
cont.resumeWith(result)
else
cont.resumeWithException(NullPointerException())
}
searchSDK.search2()
}
}
private suspend fun findMyCameras(): Channel<SearchSDK.SearchResult> {
val channel = Channel<SearchSDK.SearchResult>()
val searchSDK = SearchSDK(SearchSDK.ISearchResult { result ->
Log.d(TAG, "searchSDK get result ${result.uid}")
if (!result.uid.isEmpty())
channel.sendBlocking(result)
else
channel.close(NullPointerException())
})
launch(UI) {
searchSDK.search2()
}
channel.invokeOnClose {
searchSDK.stop()
}
return channel
}
fun findCameras(): Either<Authenticator.Failure, List<MyCameraEntity>> {
val list: ArrayList<SearchSDK.SearchResult> = ArrayList()
val emptyCamera = MyCameraEntity("", "", "", "")
runBlocking(CommonPool) {
findMyCameras().use { cameraChannel ->
while (true) {
val nextCamera = withTimeoutOrNull(2, TimeUnit.SECONDS) {
cameraChannel.receiveOrNull()x
}
if (nextCamera == null) break
list.add(result)
}
}
}
list.forEach { r ->c
Log.d(TAG, "uid ${r.uid} | ip ${r.ip} | port ${r.port} | name ${r.name} | version ${r.version} ")
}
return Either.Right(listOf(emptyCamera))
}
sendBlocking
iLobanov
09/10/2018, 6:55 AMuli
09/10/2018, 8:00 AMinvokeOnClose
was a wild guess. Maybe `searchSDK.stop()`needs to be called from a try catch around channel.sendBlocking(result)
iLobanov
09/10/2018, 8:26 AMgildor
09/10/2018, 12:03 PMiLobanov
09/10/2018, 12:10 PMgildor
09/10/2018, 12:15 PMiLobanov
09/10/2018, 12:41 PMgildor
09/10/2018, 12:45 PMiLobanov
09/10/2018, 12:51 PMuli
09/10/2018, 3:32 PMiLobanov
09/11/2018, 4:24 AMgildor
09/11/2018, 4:50 AMiLobanov
09/11/2018, 6:16 AMgildor
09/11/2018, 6:19 AMuli
09/11/2018, 6:29 AMgildor
09/11/2018, 6:30 AM