JParks
JParks

Reputation: 179

Android running out of memory

Below I am showing the first and second activities. The first one is just to show what the baseline memory is. My question is: what is going on in the second activity that is allocating so much memory?!

It should not be working so hard and I can't figure out what it is that is allocating so much memory at that steady pace. It continues to allocate at the rate shown below for the second screen until it runs out. Then I guess the GC gets called and re-allocates memory. Then the memory keeps getting allocated until it runs out again and again.

First Activity Screen:

First Screen

First Activities Memory:

Memory for First Screen

Second Activity Screen: No buttons have been pressed yet and nothing is being recorded. SignalStrengthListener checks for changes in the LTE parameters and updates the UI once per second. But the memory is going out of control.

Second Screen

Second Activity Memory:

Memory for Second Screen

Here is my code for the Second activity and its layout:

Second.java

public class Second extends Activity implements Runnable {

    public static SignalStrengthListener signalStrengthListener;
    public static TelephonyManager tm;
    List<CellInfo> cellInfoList;

    public static TextView lteRsrp;
    public static TextView lteRsrq, lteCqi;
    public static TextView cellPciTextView;
    EditText offsetText;

    Button startButton, offsetButton;
    public static int cellPci = 0;
    public static String ltestr;
    public static String[] parts;
    public static String mydate;
    public static double offset = 0.0;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);

        run();
        setupUI();
        setupButton();

    }

    private void setupUI() {
        lteRsrp = (TextView) findViewById(R.id.lteRsrp);
        lteRsrq = (TextView) findViewById(R.id.lteRsrq);
        lteCqi = (TextView) findViewById(R.id.lteCqi);
        cellPciTextView = (TextView) findViewById(R.id.cellPciTextView);
        offsetText = (EditText) findViewById(R.id.offsetText);
        startButton = (Button) findViewById(R.id.startButton);
        offsetButton = (Button) findViewById(R.id.offsetButton);


        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        parts[9] = String.valueOf(Double.parseDouble(parts[9]) + offset);

                        if (Double.parseDouble(parts[9]) == 2147483647) {
                            parts[9] = "-141";
                        }
                        if (Integer.parseInt(parts[10]) == 2147483647) {
                            parts[10] = "-21";
                        }
                        if (Integer.parseInt(parts[12]) == 2147483647) {
                            parts[12] = "-20";
                        }

                        lteRsrp.setText(String.valueOf(parts[9]));
                        lteRsrq.setText(String.valueOf(parts[10]));
                        lteCqi.setText(String.valueOf(parts[12]));
                        cellPciTextView.setText(String.valueOf(cellPci));
                    }
                });
            }
        }, 0, 1000);

    }

    private void setupButton() {
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(getBaseContext(), Third.class);
                startActivity(intent);

            }
        });

        offsetButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                offset = Double.parseDouble(offsetText.getText().toString());
                Log.d("TAG", "????????????????????????????????????????????????  offset value is = " + offset);
                InputMethodManager imm = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
            }
        });

    }

    @Override
    public void run() {
        // Moves the current Thread into the background
//        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);

        //start the signal strength listener
        signalStrengthListener = new SignalStrengthListener();
        ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS);

    }

    public class SignalStrengthListener extends PhoneStateListener {
        @Override
        public void onSignalStrengthsChanged(android.telephony.SignalStrength signalStrength) {

            ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).listen(signalStrengthListener, SignalStrengthListener.LISTEN_SIGNAL_STRENGTHS);

            tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

            ltestr = signalStrength.toString();
            parts = ltestr.split(" ");

            try {
                cellInfoList = tm.getAllCellInfo();
                for (CellInfo cellInfo : cellInfoList) {

//                        Log.d("TAG", "cellInfoList size = " + cellInfoList.size() + " +++++++++++++++++++++++++++++++");

                    if (cellInfo instanceof CellInfoLte) {
                        // cast to CellInfoLte and call all the CellInfoLte methods you need
                        // Gets the LTE PCI: (returns Physical Cell Id 0..503, Integer.MAX_VALUE if unknown)
                        cellPci = ((CellInfoLte) cellInfo).getCellIdentity().getPci();
                    }
                }
            } catch (Exception e) {
//                    Log.d("SignalStrength", "+++++++++++++++++++++++++++++++ null array spot 3: " + e);
            }

            mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
            super.onSignalStrengthsChanged(signalStrength);

        }
    }

}

second_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffdc1d">

    <TextView
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="22sp"
        android:textColor="#000000"
        android:id="@+id/lteRsrp"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true"
        android:layout_marginStart="29dp"
        android:layout_marginTop="80dp"
        android:textAlignment="textEnd"
        android:background="#ffdc1d"
        android:textStyle="bold"
        android:layout_marginBottom="20dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="= LTE RSRP"
        android:textSize="22sp"
        android:textColor="#000000"
        android:id="@+id/textView2"
        android:background="#ffdc1d"
        android:textStyle="bold"
        android:layout_alignTop="@+id/lteRsrp"
        android:layout_toEndOf="@+id/lteRsrp"
        android:layout_marginLeft="10dp" />

    <TextView
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="0"
        android:textColor="#a71b1b"
        android:textSize="22sp"
        android:id="@+id/lteRsrq"
        android:layout_below="@+id/lteRsrp"
        android:layout_alignStart="@+id/lteRsrp"
        android:textAlignment="textEnd"
        android:textStyle="bold"
        android:background="#ffdc1d"
        android:layout_marginBottom="20dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="= LTE RSRQ"
        android:textSize="22sp"
        android:textColor="#a71b1b"
        android:id="@+id/textView3"
        android:textStyle="bold"
        android:background="#ffdc1d"
        android:layout_below="@+id/lteRsrp"
        android:layout_alignStart="@+id/textView2" />

    <TextView
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="22sp"
        android:textColor="#075f09"
        android:id="@+id/cellPciTextView"
        android:layout_below="@+id/lteRsrq"
        android:layout_alignStart="@+id/lteRsrq"
        android:textAlignment="textEnd"
        android:background="#ffdc1d"
        android:textStyle="bold" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="= LTE PCI"
        android:textSize="22sp"
        android:textColor="#075f09"
        android:id="@+id/textView4"
        android:background="#ffdc1d"
        android:textStyle="bold"
        android:layout_alignTop="@+id/cellPciTextView"
        android:layout_alignStart="@+id/textView3" />

    <TextView
        android:layout_width="160dp"
        android:layout_height="wrap_content"
        android:text="0"
        android:textSize="22sp"
        android:textColor="#000000"
        android:id="@+id/lteCqi"
        android:textAlignment="textEnd"
        android:background="#ffdc1d"
        android:textStyle="bold"
        android:layout_below="@+id/cellPciTextView"
        android:layout_alignStart="@+id/cellPciTextView"
        android:layout_marginTop="20dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="= LTE CQI"
        android:textSize="22sp"
        android:textColor="#000000"
        android:id="@+id/textView"
        android:background="#ffdc1d"
        android:textStyle="bold"
        android:layout_alignTop="@+id/lteCqi"
        android:layout_alignStart="@+id/textView4" />

    <Button
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:text="Start"
        android:textColor="#ffdc1d"
        android:textSize="22sp"
        android:id="@+id/startButton"
        android:layout_marginBottom="47dp"
        android:background="#f91616"
        android:textAlignment="center"
        android:textStyle="bold"
        android:padding="4dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Press the START button to begin recording"
        android:id="@+id/textView8"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:textColor="#f91616"
        android:textSize="22sp"
        android:textStyle="italic"
        android:textAlignment="center"
        android:layout_marginTop="12dp" />

    <Button
        android:layout_width="120dp"
        android:layout_height="60dp"
        android:text="Set offset"
        android:id="@+id/offsetButton"
        android:textColor="#ffdc1d"
        android:background="#f91616"
        android:textStyle="bold"
        android:textSize="18sp"
        android:layout_marginBottom="83dp"
        android:layout_above="@+id/startButton"
        android:layout_alignStart="@+id/textView" />

    <EditText
        android:layout_width="120dp"
        android:layout_height="40dp"
        android:id="@+id/offsetText"
        android:background="#ffffff"
        android:layout_alignBottom="@+id/offsetButton"
        android:layout_alignEnd="@+id/lteCqi"
        android:text="0.0"
        android:textAlignment="center"
        android:textColor="#000000"
        android:textSize="22sp"
        android:textStyle="bold"
        android:layout_marginBottom="4dp" />


</RelativeLayout>

Upvotes: 0

Views: 142

Answers (1)

CommonsWare
CommonsWare

Reputation: 1007276

Yeah, I think you got yourself into a bit of an infinite loop there.

The docs for listen() say:

At registration, and when a specified telephony state changes, the telephony manager invokes the appropriate callback method on the listener object and passes the current (updated) values.

So, what happened was you called listen(), which called onSignalStrengthsChanged(), which called listen(), which called onSignalStrengthsChanged(), which called listen(), which called onSignalStrengthsChanged(), which called listen(), which called onSignalStrengthsChanged(), which called listen(), which called onSignalStrengthsChanged(), ...

By removing the listen() from inside the onSignalStrengthsChanged() method, you removed the infinite loop.

Upvotes: 2

Related Questions