【问题标题】:Background sticky concurrent mark sweep GC freed while using firebase database使用firebase数据库时释放了后台粘性并发标记扫描GC
【发布时间】:2019-11-04 18:27:05
【问题描述】:

我正在为物联网设备制作应用程序。我的应用程序有不同的活动来从不同的传感器获取数据。 每个活动都会在单击按钮时接收数据。每当我按下按钮时,我都会收到以下错误。

 confirm2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                // Get your custom_toast.xml layout
                LayoutInflater inflater = getLayoutInflater();

                final View layout = inflater.inflate(R.layout.custom_toast,
                        (ViewGroup) findViewById(R.id.custom_toast_layout_id));

                //Initializing the text views
                EditText editText =  findViewById(R.id.link2);
                final String link2 = editText.getText().toString();

                EditText editText1 =  findViewById(R.id.idvalue);
                final String StringValue = editText1.getText().toString();


                //Adding functionality to the text views
                fire2 = new Firebase("https://iotsense.firebaseio.com/");
                Firebase fireChild = fire2.child(link2+"/S1");
                fireChild.setValue("4");

                // Read from the database
                myRef = FirebaseDatabase.getInstance().getReference();
                myRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        // This method is called once with the initial value and again
                        // whenever data at this location is updated.

                        if(StringValue.length()>0 && link2.length()>0) {

                            try {
                            status = dataSnapshot.child(link2 + "/Analog").getValue().toString();}
                            catch (NullPointerException ignored){}

                            if(status==null){
                                TextView text4 = layout.findViewById(R.id.text4);
                                text4.setText(" Error: Wrong ID. ");
                                // Toast...
                                Toast toast = new Toast(getApplicationContext());
                                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 540);
                                toast.setDuration(Toast.LENGTH_LONG);
                                toast.setView(layout);
                                toast.show();
                                return;
                            }
                            else {
                                analogvalue = Integer.parseInt(status);

                                pin.setText(status);

                                final int value = Integer.parseInt(StringValue);
                                if (analogvalue > value) {
                                    Firebase fireChild = fire2.child(link2 + "/Pin1");
                                    fireChild.setValue(spinner1.getSelectedItem().toString());
                                    Firebase fireChild1 = fire2.child(link2 + "/Pin2");
                                    fireChild1.setValue(spinner2.getSelectedItem().toString());

                                }
                                if (analogvalue <= value) {
                                    if(spinner1.getSelectedItem().toString().equals("HIGH")){Firebase fireChild = fire2.child(link2 + "/Pin1"); fireChild.setValue("LOW");}
                                    if(spinner1.getSelectedItem().toString().equals("LOW")) {Firebase fireChild = fire2.child(link2 + "/Pin1"); fireChild.setValue("HIGH");}
                                    if(spinner2.getSelectedItem().toString().equals("HIGH")){Firebase fireChild = fire2.child(link2 + "/Pin2"); fireChild.setValue("LOW");}
                                    if(spinner2.getSelectedItem().toString().equals("LOW")) {Firebase fireChild = fire2.child(link2 + "/Pin2"); fireChild.setValue("HIGH");}
                                }
                            }
                        }
                    }
I/art: Background sticky concurrent mark sweep GC freed 132932(5MB) AllocSpace objects, 21(744KB) LOS objects, 13% free, 35MB/40MB, paused 1.556ms total 109.059ms
I/art: Background sticky concurrent mark sweep GC freed 94569(3MB) AllocSpace objects, 0(0B) LOS objects, 5% free, 38MB/40MB, paused 8.078ms total 68.990ms
I/art: Background sticky concurrent mark sweep GC freed 101736(3MB) AllocSpace objects, 0(0B) LOS objects, 3% free, 39MB/40MB, paused 5.349ms total 81.087ms
I/art: Background sticky concurrent mark sweep GC freed 48181(1662KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 40MB/40MB, paused 5.361ms total 56.784ms

【问题讨论】:

  • 这些不是错误消息。它们是关于垃圾收集的信息性消息,这在所有应用程序中都会自然发生。你可以看出,因为每一行都以大写的“I”开头,并且每行都提到了“GC”。
  • @DougStevenson 我怎样才能避免这种情况,因为我的应用程序停止工作。
  • 应用程序不会因为垃圾收集而停止工作。 GC 发生在所有应用程序中,有时非常频繁。还有其他问题。

标签: java android firebase firebase-realtime-database


【解决方案1】:

您在 onClick 中做了很多工作,当您单击按钮时,它会做同样的事情。

这可能会导致不必要的内存分配,因此如您所见,它们正在执行大量 GC。

我建议你把一些代码移到 onClick 里面

  • 获取视图的代码,如 findViewById,视图变量也

  • 您不必动态更改的 firebase 代码

  • 用于实例化和设置 toast 消息的代码

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 2016-07-30
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2013-06-16
    相关资源
    最近更新 更多