在另一个线程上运行 Firebase 回调会阻塞 UI

埃斯科巴5

我知道这个问题可能看起来重复,我已经阅读了十个关于同一件事的其他主题,但我找不到问题

我在我的活动中有这个方法:

public void saveResponse(final Response studentResponse, final Content content)
    fb.getReference("...").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(final DataSnapshot dataSnapshot) {

           new Thread(new Runnable() {
               @Override
               public void run() {
                    Map<String, Object> responseMap = new HashMap<>();
                    responseMap.put("end_date", studentResponse.end_date);
                    responseMap.put("start_date", studentResponse.start_date);
                    responseMap.put("time", studentResponse.time);
                    responseMap.put("points", studentResponse.points);
                    responseMap.put("max_points", studentResponse.max_points);
                    responseMap.put("selected_options", studentResponse.selected_options);
                    if (!TextUtils.isEmpty(studentResponse.free_text))
                        responseMap.put("free_text", studentResponse.free_text);

                    DataSnapshot contentRef = dataSnapshot.child("/sections/" + currentSection + "/sections/" + currentSubsection + "/contents/" + content.id);
                    final int oldPoints = contentRef.hasChild("points") ? contentRef.child("points").getValue(int.class) : 0;
                    contentRef.getRef().setValue(responseMap);
                    contentRef.getRef().setPriority(ServerValue.TIMESTAMP);

                    DataSnapshot subSectionRef = dataSnapshot.child("/sections/" + currentSection + "/sections/" + currentSubsection);
                    long subSectionPoints = (subSectionRef.hasChild("points") ? subSectionRef.child("points").getValue(long.class) : 0) + studentResponse.points - oldPoints;
                    subSectionRef.child("points").getRef().setValue(subSectionPoints);

                    int indexOf = currentContents.indexOf(content) + 1;
                    if(indexOf > 0 && indexOf < currentContents.size()) {
                        CourseContent content = currentContents.get(indexOf);
                        subSectionRef.child("currentPosition").getRef().setValue(content.order);
                    }

                    DataSnapshot sectionRef = dataSnapshot.child("/sections/" + currentSection);
                    long sectionPoints = (sectionRef.hasChild("points") ? sectionRef.child("points").getValue(long.class) : 0) + studentResponse.points - oldPoints;
                    sectionRef.child("points").getRef().setValue(sectionPoints);

                    long coursePoints = (dataSnapshot.hasChild("points") ? dataSnapshot.child("points").getValue(long.class) : 0) + studentResponse.points - oldPoints;
                    dataSnapshot.child("points").getRef().setValue(coursePoints);
                    dataSnapshot.getRef().setPriority(MAX_SAFE_INTEGER - coursePoints);

                    int completed = 0;
                    for (DataSnapshot sect : dataSnapshot.child("sections").getChildren()) {
                        for (DataSnapshot subSect : sect.child("sections").getChildren()) {
                            int currPos = subSect.hasChild("currentPosition") ? subSect.child("currentPosition").getValue(int.class) : 0;
                            completed += currPos;
                        }
                    }

                    double progress = totalContents > 0 ? (double) completed / (double) totalContents : 0;
                    dataSnapshot.child("progress").getRef().setValue(progress);
               }
           }.start();
        }
        ...
    });
}

在单击处理程序中,我调用此方法,然后更改片段(使用自定义动画)。

问题是,片段过渡不平滑,它会冻结一点,如果我评论 runnable 中的所有内容,那么它会运行平滑。我也尝试过使用 AsyncTask 并且发生同样的情况。

在 runnable 中,我只是查询 dataSnapshot 及其子项,并设置一些值 ( dataSnapshot.child("item").getRef().setValue(x))

另一个奇怪的事情是,如果我在 run() 中放置一个断点,它也可以顺利运行。

类球体

每次调用 onDataChange 方法都会创建一个新线程,奇怪的是:“如果我在 run() 中放置一个断点,它也可以顺利运行。” 可能是您应该检查是否创建了太多线程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在另一个类的UI线程上运行

来自分类Dev

从另一个线程在UI线程上运行方法

来自分类Dev

从另一个线程调用方法而不会阻塞该线程(或为非UI线程编写自定义SynchronizationContext)C#

来自分类Dev

从另一个线程调用方法而不会阻塞该线程(或为非UI线程编写自定义SynchronizationContext)C#

来自分类Dev

当任务在android中的另一个线程中运行时,如何更新UI?

来自分类Dev

UI线程上的回调设计模式

来自分类Dev

使用Firebase UI RecyclerView打开另一个活动

来自分类Dev

使用Angular UI Router在另一个文件中定义onEnter和onExit回调

来自分类Dev

将值从Firebase JS回调方法(DAL)返回到另一个函数(控制器)

来自分类Dev

Android UI挂在JDBC连接上-即使连接在另一个线程上

来自分类Dev

android:从另一个类中的另一个线程更新UI

来自分类Dev

从另一个线程访问UI控件

来自分类Dev

为什么非 UI 线程会阻塞 UI?

来自分类Dev

打开另一个 wx.python 框架导致主 UI 被阻塞

来自分类Dev

Firebase UI回调中的signInSuccessWithAuthResult返回值

来自分类Dev

Python-通知另一个线程在子进程上被阻塞

来自分类Dev

异步端点的调用被另一个线程阻塞

来自分类Dev

如果我在一个线程中侦听 websocket 并在另一个线程中运行一个函数,是否可能会错过消息

来自分类Dev

当另一个线程正在运行时,线程联接会导致分段错误

来自分类Dev

为什么线程会阻塞我的JavaFX UI线程?

来自分类Dev

通知ui的最佳方法是在wpf中另一个线程上发生什么情况?

来自分类Dev

从另一个线程调用时,WCF Duplex回调方法永远不会执行

来自分类Dev

从另一个类和线程的接口回调更新winform

来自分类Dev

火炬:如何在另一个线程中注册火炬回调?

来自分类Dev

为什么我的回调消息在另一个线程中执行?

来自分类Dev

C#/ WPF从另一个类中创建的另一个线程更新UI

来自分类Dev

Android将数据从主UI线程发送到另一个线程

来自分类Dev

从另一个线程处理UI线程中的TextView不会引发异常

来自分类Dev

在另一个线程中在python3中运行的非阻塞套接字服务器

Related 相关文章

  1. 1

    在另一个类的UI线程上运行

  2. 2

    从另一个线程在UI线程上运行方法

  3. 3

    从另一个线程调用方法而不会阻塞该线程(或为非UI线程编写自定义SynchronizationContext)C#

  4. 4

    从另一个线程调用方法而不会阻塞该线程(或为非UI线程编写自定义SynchronizationContext)C#

  5. 5

    当任务在android中的另一个线程中运行时,如何更新UI?

  6. 6

    UI线程上的回调设计模式

  7. 7

    使用Firebase UI RecyclerView打开另一个活动

  8. 8

    使用Angular UI Router在另一个文件中定义onEnter和onExit回调

  9. 9

    将值从Firebase JS回调方法(DAL)返回到另一个函数(控制器)

  10. 10

    Android UI挂在JDBC连接上-即使连接在另一个线程上

  11. 11

    android:从另一个类中的另一个线程更新UI

  12. 12

    从另一个线程访问UI控件

  13. 13

    为什么非 UI 线程会阻塞 UI?

  14. 14

    打开另一个 wx.python 框架导致主 UI 被阻塞

  15. 15

    Firebase UI回调中的signInSuccessWithAuthResult返回值

  16. 16

    Python-通知另一个线程在子进程上被阻塞

  17. 17

    异步端点的调用被另一个线程阻塞

  18. 18

    如果我在一个线程中侦听 websocket 并在另一个线程中运行一个函数,是否可能会错过消息

  19. 19

    当另一个线程正在运行时,线程联接会导致分段错误

  20. 20

    为什么线程会阻塞我的JavaFX UI线程?

  21. 21

    通知ui的最佳方法是在wpf中另一个线程上发生什么情况?

  22. 22

    从另一个线程调用时,WCF Duplex回调方法永远不会执行

  23. 23

    从另一个类和线程的接口回调更新winform

  24. 24

    火炬:如何在另一个线程中注册火炬回调?

  25. 25

    为什么我的回调消息在另一个线程中执行?

  26. 26

    C#/ WPF从另一个类中创建的另一个线程更新UI

  27. 27

    Android将数据从主UI线程发送到另一个线程

  28. 28

    从另一个线程处理UI线程中的TextView不会引发异常

  29. 29

    在另一个线程中在python3中运行的非阻塞套接字服务器

热门标签

归档