2016-04-12 70 views
0

下面我顯示了第一個和第二個活動。第一個只是顯示基線記憶是什麼。我的問題是:在分配如此之多的內存的第二項活動中發生了什麼?!Android內存不足

它不應該工作太辛苦,我不知道它是如何穩定地分配這麼多的內存。它繼續按照下面顯示的速率分配第二個屏幕,直到耗盡。然後我猜GC被調用並重新分配內存。然後內存不斷分配,直到它一次又一次地耗盡。

第一個活動屏幕:

First Screen

首場活動內存:

Memory for First Screen

次活動畫面: 沒有按鈕被按下但並沒有什麼貝因g記錄。 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

使用分配跟蹤或堆轉儲來確定發生了什麼。 – CommonsWare

+0

我已經這樣做了,但我無法理解跟蹤或轉儲。我看到很多對SignalStrengthListener的嵌套調用。我非常肯定這是罪魁禍首,但我無法弄清楚一個問題。 – JParks

+1

那麼,每次調用'onSignalStrengthsChanged()'回調函數時,都應該只調用一次'listen()',而不是一次。你也可以考慮一次調用'getSystemService(Context.TELEPHONY_SERVICE)'(而不是每次調用前後兩次),並且只調用一次'getDateTimeInstance()'(而不是每次調用一次)。 – CommonsWare

回答

1

是啊,我覺得你有自己變成一個有點無限循環那裏。

The docs for listen()說:

註冊時,並且當在指定的電話狀態改變時,所述電話管理器調用監聽器對象上的適當的回調方法,並傳遞電流(更新)值。

那麼,發生了什麼事是你叫listen(),呼籲onSignalStrengthsChanged(),呼籲listen(),呼籲onSignalStrengthsChanged(),呼籲listen(),呼籲onSignalStrengthsChanged(),呼籲listen(),呼籲onSignalStrengthsChanged(),呼籲listen(),呼籲onSignalStrengthsChanged() ,...

通過從onSignalStrengthsChanged()方法中刪除listen(),您刪除了無限循環。

+0

你真了不起!謝謝!我錯了,我拿出了onSignalStrengthsChanged裏面的listen(),它仍然有效,但更重要的是我的記憶力平平!我不再耗盡內存!我一直盯着那個月,我讀了Docs,但並不理解它。對代碼有第二雙眼睛是非常寶貴的。 – JParks