簡體   English   中英

當 object 添加到 firebase - Android Studio 時,應用程序崩潰與 GC

[英]App crash with GC When an object added to firebase - Android Studio

您好,我有一個 Android 應用程序

當在 firebase 中完成更新(在 firebase 中插入新數據或更新屬性)時,應用程序將崩潰 15-30 秒。

當我檢查日志時,它表明當時 GC 正在工作,並且需要花費大量時間來完成他的工作,因此該應用程序崩潰了很多時間,並且在電話上,您無法執行任何操作,直到 GC 在那里完成工作,我的數據庫中沒有太多數據,我的應用程序也沒有那么大。

您可以在此處查看日志:

I/lhindeliveryma: Background concurrent copying GC freed 325485(8953KB) AllocSpace objects, 0(0B) LOS objects, 36% free, 10MB/16MB, paused 218us total 136.046ms
W/Looper: Slow Looper main: Long Msg: seq=1424 plan=02:06:39.877  late=2ms wall=2060ms running=1848ms runnable=39ms io=29ms h=android.os.Handler c=com.google.firebase.database.core.view.EventRaiser$1
I/lhindeliveryma: Background concurrent copying GC freed 373886(10MB) AllocSpace objects, 0(0B) LOS objects, 35% free, 11MB/17MB, paused 259us total 155.904ms
I/lhindeliveryma: Background concurrent copying GC freed 501873(13MB) AllocSpace objects, 0(0B) LOS objects, 33% free, 11MB/17MB, paused 394us total 247.891ms
I/lhindeliveryma: Background young concurrent copying GC freed 323701(8831KB) AllocSpace objects, 0(0B) LOS objects, 31% free, 12MB/17MB, paused 537us total 116.240ms
I/lhindeliveryma: Background concurrent copying GC freed 567601(15MB) AllocSpace objects, 0(0B) LOS objects, 32% free, 12MB/18MB, paused 430us total 288.562ms
I/lhindeliveryma: Background young concurrent copying GC freed 351662(9586KB) AllocSpace objects, 0(0B) LOS objects, 32% free, 12MB/18MB, paused 528us total 125.947ms
W/Looper: Slow Looper main: Long Msg: seq=1425 plan=02:06:40.037  late=1902ms wall=1811ms running=1692ms runnable=2ms h=android.os.Handler c=com.google.firebase.database.core.view.EventRaiser$1
I/Choreographer: Skipped 180 frames!  The application may be doing too much work on its main thread.

這就是日志所說的

這是我如何從 firebase 接收數據的代碼:


        FirebaseAuth mAuth;
        mAuth = FirebaseAuth.getInstance();

        FirebaseUser user = mAuth.getCurrentUser();


        firebaseDatabase = FirebaseDatabase.getInstance();


        EndLoop:
        databaseReference = firebaseDatabase.getReference().child("Orders").child(City);
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {




                You = new ArrayList<>();
                Now = new ArrayList<>();


                postAd = new OrderAD();

                boolean stop = false;

                for (DataSnapshot postsnap : dataSnapshot.getChildren()) {
                    if(!stop)
                    for (DataSnapshot postsnap1 : postsnap.getChildren()) {
                        if(!stop)
                        for (DataSnapshot postsnap2 : postsnap1.getChildren()) {
                            if (!stop) {
                                Order post = postsnap2.getValue(Order.class);

                                if (!post.getStatus().equals("تم التوصيل") && !post.getStatus().equals("تم الغاء الطلب")) {




                                    if (post.getDeliveryUID().equals(user.getUid()))
                                        You.add(post);
                                    else {
                                        if (post.getDeliveryUID().equals("")) {
                                            Now.add(post);

                                        }

                                    }

                                    if (!Offers.contains(post.getKey())) {
                                        Offers.add(post.getKey());
                                        if (Done) {
                                            show_Notification(post);
                                            You.clear();
                                            Now.clear();
                                            stop = true;
                                            System.out.println("Hello");
                                            break;
                                        }
                                    }

                                }

                                break;


                            }
                        }

                    }
                }

                if(!Done){
                    Done = true;
                }



                Collections.sort(Now);
                Collections.sort(You);


                postAd = new OrderAD(Offers.this, Now);
                recyclerView.setAdapter(postAd);








            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

有什么建議可以解決這個問題嗎?

應用程序將崩潰。

這是預期的行為,因為一次讀取 1000 多個節點可以被視為大量數據,這很可能不適合 memory。 除此之外,我看到你循環了孩子們三遍。 這意味着在Orders/City下還存在其他節點,這意味着要讀取更多數據。 在實時數據庫中,當您將偵聽器附加到數據庫中的特定位置時,您會讀取(下載)該節點及其下的所有子節點。 在這種情況下,最好對數據進行非規范化。 這意味着您應該創建另一個節點,該節點應該只包含您對節點的平面列表感興趣的數據。 除此之外,最好根據您的需要通過調用Query#limitToFirst(int limit)Query#limitToLast(int limit)來限制您讀取的數據量。 除此之外,還建議實現pagination

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM