下面我显示了第一个和第二个活动。第一个只是显示基线记忆是什么。我的问题是:在分配如此之多的内存的第二项活动中发生了什么?!Android内存不足
它不应该工作太辛苦,我不知道它是如何稳定地分配这么多的内存。它继续按照下面显示的速率分配第二个屏幕,直到耗尽。然后我猜GC被调用并重新分配内存。然后内存不断分配,直到它一次又一次地耗尽。
第一个活动屏幕:
首场活动内存:
次活动画面: 没有按钮被按下但并没有什么贝因g记录。 SignalStrengthListener检查LTE参数的变化并每秒更新一次UI。但是记忆失控了。
次活动内存:
这里是我的第二个活动代码和它的布局:
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>
使用分配跟踪或堆转储来确定发生了什么。 – CommonsWare
我已经这样做了,但我无法理解跟踪或转储。我看到很多对SignalStrengthListener的嵌套调用。我非常肯定这是罪魁祸首,但我无法弄清楚一个问题。 – JParks
那么,每次调用'onSignalStrengthsChanged()'回调函数时,都应该只调用一次'listen()',而不是一次。你也可以考虑一次调用'getSystemService(Context.TELEPHONY_SERVICE)'(而不是每次调用前后两次),并且只调用一次'getDateTimeInstance()'(而不是每次调用一次)。 – CommonsWare