有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程堆栈未完全执行,并切换到我的线程堆栈

有一个函数从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

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


共 (1) 个答案

  1. # 1 楼答案

    我能够在一个线程中完成这一点:

    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-2412:39:41.71915347-15455/com。实例gotracker D/dbThread:pool-4-thread-1
    2020-10-24 12:39:42.02515347-15455/com。实例gotracker D/dbThread:pool-4-thread-1