下面我将展示第一和第二项活动。第一个是显示基线内存是什么。我的问题是:在分配如此多内存的第二个活动中发生了什么?!
它不应该如此努力,我无法弄清楚它是以这种稳定的速度分配如此多的内存。它继续按照下面显示的速率分配给第二个屏幕,直到它用完为止。然后我猜GC被调用并重新分配内存。然后内存不断被分配,直到它一次又一次地耗尽。
第一个活动屏幕:
第一活动记忆:
第二个活动屏幕: 没有按下任何按钮,也没有记录任何内容。 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>
答案 0 :(得分:1)
是的,我认为你在那里遇到了一些无限循环。
在注册时,当指定的电话状态发生更改时,电话管理器会在侦听器对象上调用相应的回调方法,并传递当前(更新的)值。
所以,发生了什么事,你打电话给listen()
,调用onSignalStrengthsChanged()
,调用listen()
,调用onSignalStrengthsChanged()
,调用listen()
,调用onSignalStrengthsChanged()
listen()
名为onSignalStrengthsChanged()
,名为listen()
,名为onSignalStrengthsChanged()
,名为listen()
,...
通过从onSignalStrengthsChanged()
方法中删除{{1}},您删除了无限循环。