2015-10-06 73 views
0

我正在寫一個android的應用程序來記錄所有的傳感器數據,但經過可變時間段的應用程序不斷崩潰傳感器服務死亡日誌,然後智能手機似乎重置自己。 我logcat的是這樣的:如何減少GC_CONCURRENT操作?

I/sensorLis﹕ added MPL Accelerometer 
I/sensorLis﹕ added MPL Gyroscope 
I/sensorLis﹕ added Corrected Gyroscope Sensor 
I/sensorLis﹕ added MPL Magnetic Field 
I/sensorLis﹕ added MPL Gravity 
I/sensorLis﹕ added Gravity Sensor 
I/sensorLis﹕ added MPL Rotation Vector 
I/sensorLis﹕ added Rotation Vector Sensor 
D/dalvikvm﹕ GC_CONCURRENT freed 509K, 7% free 9687K/10375K, paused 6ms+4ms 
D/dalvikvm﹕ GC_CONCURRENT freed 416K, 7% free 9674K/10375K, paused 9ms+1ms 
D/dalvikvm﹕ GC_CONCURRENT freed 405K, 7% free 9676K/10375K, paused 13ms+4ms 
D/dalvikvm﹕ GC_CONCURRENT freed 391K, 7% free 9676K/10375K, paused 4ms+1ms 
D/dalvikvm﹕ GC_CONCURRENT freed 406K, 7% free 9677K/10375K, paused 5ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 405K, 7% free 9678K/10375K, paused 6ms+6ms 
D/dalvikvm﹕ GC_CONCURRENT freed 395K, 7% free 9681K/10375K, paused 1ms+2ms 
D/dalvikvm﹕ GC_CONCURRENT freed 412K, 7% free 9680K/10375K, paused 9ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 407K, 7% free 9679K/10375K, paused 3ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 404K, 7% free 9681K/10375K, paused 6ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 414K, 7% free 9689K/10375K, paused 8ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 422K, 7% free 9680K/10375K, paused 4ms+4ms 
D/dalvikvm﹕ GC_CONCURRENT freed 393K, 7% free 9680K/10375K, paused 4ms+2ms 
D/dalvikvm﹕ GC_CONCURRENT freed 395K, 7% free 9690K/10375K, paused 6ms+6ms 
D/dalvikvm﹕ GC_CONCURRENT freed 420K, 7% free 9682K/10375K, paused 5ms+2ms 
D/dalvikvm﹕ GC_CONCURRENT freed 409K, 7% free 9680K/10375K, paused 4ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 399K, 7% free 9680K/10375K, paused 6ms+5ms 
D/dalvikvm﹕ GC_CONCURRENT freed 393K, 7% free 9682K/10375K, paused 6ms+2ms 
D/dalvikvm﹕ GC_CONCURRENT freed 412K, 7% free 9680K/10375K, paused 5ms+3ms 
D/dalvikvm﹕ GC_CONCURRENT freed 387K, 7% free 9681K/10375K, paused 6ms+3ms 
W/Sensors﹕ sensorservice died [0x1e56260] 
I/ActivityThread﹕ Removing dead content provider: settings 
E/InputQueue-JNI﹕ channel '41d3d498 com.edu.jirka.naviin/com.edu.jirka.naviin.Navin (client)' 

而在崩潰的時候,我有SensorDataSaver的只是幾個instaces運行的偵聽器的像5至90秒。

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.util.Log; 
import android.widget.Toast; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 

/** 
* Created by Jirka on 8/21/2015. 
* 
* - designed for sensor data saving to files on external storage 
*/ 

public class SensorDataSaver implements SensorEventListener{ 

    private SensorManager mSensorManager; 
    private BufferedWriter bw; 
    private Sensor mSensor; 

    /** 
    * class designed to save data of any 3D individual sensor. 
    * 
    * @param ma - activity for SensorManager, Resources access 
    * @param header - basic info about sensor 
    * @param ssr - sensor to by listen to 
    */ 
    public SensorDataSaver(Activity ma, String header, Sensor ssr, File sampleDir) { 
     mSensor = ssr; 
     mSensorManager = (SensorManager) ma.getSystemService(Context.SENSOR_SERVICE); 
     try { 
      // Header creation 
      File mFile = new File(sampleDir, mSensor.getName().replace(" ", "_") + "_Data.txt"); 
      bw = new BufferedWriter(new FileWriter(mFile)); 
      bw.write(header); 
      bw.append("Timestamp X_axis Y_axis Z_axis Current Accuracy\n"); 
     }catch (NullPointerException n){ 
      Log.e("File_Err","Fault during creating output file"); 
     } catch (IOException e) { 
      Log.e("BuffW_Init","Fault during BufferedWriter init"); 
      e.printStackTrace(); 
     } 

    } 

    public void startCollecting(int del){ 
     mSensorManager.registerListener(this,mSensor,del); 
     Log.i("sensorLis","added " + mSensor.getName()); 
    } 

    public void finishCollecting(){ 
     // deploy listener 
     mSensorManager.unregisterListener(this); 
     // close file 
     try { 
      bw.close(); 
     } catch (IOException e) { 
      Log.e("BuffW_Close","Fault during BufferedWriter closing"); 
      e.printStackTrace(); 
     } 
    } 


    /* onSensorChanged method of SensorListener */ 
    public void onSensorChanged(SensorEvent se) { 
     try { 
      bw.append(se.timestamp + " " + se.values[0] + " " 
        + se.values[1] + " " + se.values[2] + " " + se.sensor.getPower() + " " 
        + se.accuracy); 
      bw.newLine(); 
     }catch (IOException e) { 
      e.printStackTrace(); 
      Log.e("BW_APPEND",mSensor.toString() + " fault during appending sensor changes"); 
     } 
    } 

    /* onAccuracyChanged method of SensorListener */ 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     /* accuracy changes omitted due to accuracy logging in onSensorChanged 
     try { 
      bw.append("Accuracy " + sensor.getName() + " -> " + accuracy); 
      bw.newLine(); 
     }catch (IOException e) { 
      e.printStackTrace(); 
      Log.e("BW_APPEND", "Fault during appending accuracy changes"); 
     }*/ 
    } 


} 

所以,你有什麼想法如何減少GC行動,並保持傳感器服務免於死亡? 我需要能夠將傳感器數據記錄至少10分鐘。

謝謝。

+1

您似乎在問兩個無關的問題:如何減少GC活動,以及如何防止傳感器服務死亡。後者似乎更重要,但不在你的問題的主題。你知道傳感器服務爲什麼會死亡嗎? – fadden

+0

我不知道確切的,但我想記錄大約的傳感器數據。 6個傳感器與'SENSOR_DELAY_FASTEST',所以我想傳入消息sensorService可能會導致它。 –

回答

1

所以,你有什麼想法如何減少GC行動,並保持傳感器服務不死?

我會通過清理onSensorChanged(),因爲這將被稱爲很多開始,擺脫記憶翻騰字符串連接:

public void onSensorChanged(SensorEvent se) { 
    try { 
     bw.append(se.timestamp); 
     bw.append(" "); 
     bw.append(se.values[0]); 
     bw.append(" "); 
     bw.append(se.values[1]); 
     bw.append(" "); 
     bw.append(se.values[2]); 
     bw.append(" "); 
     bw.append(se.sensor.getPower()); 
     bw.append(" "); 
     bw.append(se.accuracy); 
     bw.newLine(); 
    } catch (IOException e) { 
     Log.e("BW_APPEND", mSensor.toString() + " fault during appending sensor changes", e); 
    } 
} 

除此之外,使用的開發工具,以確定您花費你的時間和你的RAM。例如,Android Studio可以幫助您跟蹤CPU使用情況和內存分配情況。

+0

謝謝。我使用StringBuilder改進了很多,但仍然可以找出如何阻止sensorService死亡。 –