线程堆栈未完全执行,并切换到mine



有一个函数从Firebase数据库接收数据,并据此创建列表。我需要在一个单独的线程中执行此操作。我试着这样做,但看起来有些代码是在侧线程中执行的,有些是在我的中执行的。

有趣:

fun initUserTracks() {
userTracks = mutableListOf()
REF_DATABASE_ROOT.child(NODE_TRACKS).child(UID)
.addListenerForSingleValueEvent(AppValueEventListener {
thread {
it.children.forEach { trackID ->
Log.d("dbThread", Thread.currentThread().name)
var userTrack = UserTrack(TYPE_CONTENT)
userTrack.distance =
trackID.child(CHILD_DISTANCE).getValue(Double::class.java)!!
userTrack.time = LocationConverter.convertMStoTime(
trackID.child(CHILD_TIME).getValue(Long::class.java)!!
)
userTrack.startTime =
timeToDate(
trackID.child(CHILD_START_TIME).getValue(Long::class.java)!!
)
REF_DATABASE_ROOT.child(NODE_TRACKS).child(UID)
.child(trackID.key.toString()).child(
CHILD_TRACK_POINTS
).addListenerForSingleValueEvent(AppValueEventListener { tracks ->
tracks.children.forEach { points ->
Log.d("dbThread", Thread.currentThread().name)
var pointsList = mutableListOf<Point>()
points.children.forEach { point ->
pointsList.add(
Point(
point.child(CHILD_LATITUDE)
.getValue(Double::class.java) as Double,
point.child(CHILD_LONGITUDE)
.getValue(Double::class.java) as Double
)
)
}
userTrack.trackPoints = pointsList
}
userTracks.add(userTrack)
}
)
}
}
})

}

如果你看一下日志,结果是这样的:

2020-10-17 16:07:31.015 29067-29165/com.example.gotracker D/dbThread: Thread-19
2020-10-17 16:07:31.048 29067-29165/com.example.gotracker D/dbThread: Thread-19
2020-10-17 16:07:31.177 29067-29067/com.example.gotracker D/dbThread: main
2020-10-17 16:07:31.304 29067-29067/com.example.gotracker D/dbThread: main

但我需要线程{}内的所有内容都在侧线程中执行。怎么了?

我能够在一个线程中实现这一点:

fun initUserTracks() {
executor = Executors.newSingleThreadExecutor()
var userTrack = UserTrack(TYPE_CONTENT)
userTracks = mutableListOf()
REF_DATABASE_ROOT.child(NODE_TRACKS).child(UID)
.addListenerForSingleValueEvent(AppValueEventListener {

it.children.forEach { trackID ->

executor.execute {
userTrack = UserTrack(TYPE_CONTENT)
Log.d("dbThread", Thread.currentThread().name)
userTrack.distance =
trackID.child(CHILD_DISTANCE).getValue(Double::class.java)!!
userTrack.time = LocationConverter.convertMStoTime(
trackID.child(CHILD_TIME).getValue(Long::class.java)!!
)
userTrack.startTime =
timeToDate(
trackID.child(CHILD_START_TIME).getValue(Long::class.java)!!
)

}

REF_DATABASE_ROOT.child(NODE_TRACKS).child(UID)
.child(trackID.key.toString()).child(
CHILD_TRACK_POINTS
).addListenerForSingleValueEvent(AppValueEventListener { tracks ->
tracks.children.forEach { points ->
executor.execute {
Log.d("dbThread", Thread.currentThread().name)
var pointsList = mutableListOf<Point>()
points.children.forEach { point ->
pointsList.add(
Point(
point.child(CHILD_LATITUDE)
.getValue(Double::class.java) as Double,
point.child(CHILD_LONGITUDE)
.getValue(Double::class.java) as Double
)
)
}

userTrack.trackPoints =  pointsList
}
}
userTracks.add(userTrack)
}
)

}

})

}

日志:

2020-10-24 12:39:41.719 15347-15455/com.example.gotracker D/db线程:池4-线程-1
2020-10-2412:39:42.025 15347-15455/2com.example.goteracker D/db线程:池-4-线程-1

最新更新