Android内存不足

时间:2016-04-12 21:42:50

标签: android debugging memory-management

下面我将展示第一和第二项活动。第一个是显示基线内存是什么。我的问题是:在分配如此多内存的第二个活动中发生了什么?!

它不应该如此努力,我无法弄清楚它是以这种稳定的速度分配如此多的内存。它继续按照下面显示的速率分配给第二个屏幕,直到它用完为止。然后我猜GC被调用并重新分配内存。然后内存不断被分配,直到它一次又一次地耗尽。

第一个活动屏幕:

First Screen

第一活动记忆:

Memory for First Screen

第二个活动屏幕: 没有按下任何按钮,也没有记录任何内容。 SignalStrengthListener检查LTE参数的变化并每秒更新一次UI。但记忆失控。

Second Screen

第二次活动记忆:

Memory for Second Screen

以下是我的第二项活动及其布局的代码:

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>

1 个答案:

答案 0 :(得分:1)

是的,我认为你在那里遇到了一些无限循环。

The docs for listen()说:

  

在注册时,当指定的电话状态发生更改时,电话管理器会在侦听器对象上调用相应的回调方法,并传递当前(更新的)值。

所以,发生了什么事,你打电话给listen(),调用onSignalStrengthsChanged(),调用listen(),调用onSignalStrengthsChanged(),调用listen(),调用onSignalStrengthsChanged() listen()名为onSignalStrengthsChanged(),名为listen(),名为onSignalStrengthsChanged(),名为listen(),...

通过从onSignalStrengthsChanged()方法中删除{{1}},您删除了无限循环。