2013-01-17 36 views
2

我想爲android寫一個步驟計數器。它目前在一個活動中包含四個按鈕: 一個按鈕,用於開始記錄存儲在數組列表中的加速度計數據。 ArrayList使用Trace類型,這是我創建的類,用於保存一個傳感器更改的數據。我也有一個停止按鈕,以及從文本文件讀取或寫入數據的按鈕。如何讀取和寫入有關在android中的加速度計的數據?

這個程序一直給我的ArrayList的一個NullPointerException,我想不通爲什麼。任何幫助將不勝感激!

編輯:對不起,如果縮進是關閉或代碼不清楚,這是一個學校作業,我在嚴格的截止日期,所以我必須急於使代碼可用之前,我可以擔心可讀性或效率。

編輯2:我不再得到任何異常,但我仍然無法讀/寫正確。我能夠成功寫入文件,然後以某種方式停止運行。

package com.myApp.playpool; 

    //imports 

public class MainActivityBAK extends Activity implements SensorEventListener{ 

    //global fields (traces is instantiated here as new arraylist) 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     acceleration=(TextView)findViewById(R.id.acceleration); 
     startButton = (Button) findViewById(R.id.startButton); 
     stopButton = (Button) findViewById(R.id.stopButton); 
     readButton = (Button) findViewById(R.id.readButton); 
     writeButton = (Button) findViewById(R.id.writeButton); 

     sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME); 

     dataFilePath = getString(R.string.data_file_path); 
     acceleration.setText("Current file: " + dataFilePath); 

     lastCheck = System.currentTimeMillis(); 

     defineButtons(); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 
    @Override 
    public void onSensorChanged(SensorEvent event1) { 

     if (running && ((System.currentTimeMillis() - lastCheck) > 1000)) { 
      acceleration.setText("X: "+event1.values[0]+"\nY: "+event1.values[1]+"\nZ: "+event1.values[2]); 
      traces.add(new Trace(System.currentTimeMillis(), event1.values[0], event1.values[1], event1.values[2])); 
      lastCheck = System.currentTimeMillis(); 
     } 

    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    public void defineButtons() { //defines onClick methods for the buttons 

     startButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       traces = new ArrayList<Trace>(); 
       running = true; 
      } 
     }); 

     stopButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       traces = new ArrayList<Trace>(); 
       running = false; 
      } 
     }); 

     readButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       try { 
        scan = new Scanner(new File(dataFilePath)); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
       while (scan.hasNext()) { 
        String str = scan.nextLine(); 
        String [] strings = str.split(";"); 
        double time = Double.parseDouble(strings[0]); 
        float x = Float.parseFloat(strings[0]), y = Float.parseFloat(strings[1]), z = Float.parseFloat(strings [2]); 
        traces.add(new Trace(time, x, y, z)); 
       } 

       Toast.makeText(getBaseContext(), 
         ("Done reading to SD file: '" + dataFilePath + "'"), 
         Toast.LENGTH_SHORT).show(); 
       scan.close(); 
      } 
     }); 

     writeButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       try { 
        File file = new File(dataFilePath); 
        print = new PrintWriter(file); 
        file.createNewFile(); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       for (int i = 0; i < traces.size(); i++) { 
        double time = traces.get(i).time; 
        float x = traces.get(i).x, y = traces.get(i).y, z = traces.get(i).z; 
        print.println(time + ";" + x + ";" + y + ";" + z + ";"); 
       } 
       print.close(); 
       Toast.makeText(getBaseContext(), 
         ("Done writing to SD file: '" + dataFilePath + "'"), 
         Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 

} 

似乎在被撞毀在寫方法循環:

for (int i = 0; i < traces.size(); i++) { 
+0

添加完整的堆棧跟蹤。並告訴我們它正在崩潰的線路。 –

+0

我不知道如何發佈堆棧跟蹤,只有如何在程序中顯示它。它似乎在寫入方法中的for循環中崩潰:\t \t \t \t \t \t for(int i = 0; i

+0

默認情況下,Java將其設置爲false。所以這是錯誤的,直到按鈕被點擊。 –

回答

1

你只初始化變量traces如果你的按鈕啓動或停止被點擊。

如果你點擊之前的「寫」按鈕,則引用是仍然空。

1

看起來可能像traces尚未在onSensorChanged()readButton.setOnClickListener中初始化,儘管如果沒有完整的源代碼或堆棧跟蹤很難說清楚。如果traces是「//全球場」,那麼你或許應該初始化它在那裏的聲明,如:

protected ArrayList<Trace> traces = new ArrayList<Trace>(); 

編輯第二個問題

我的猜測是,使用File.createNewFile()方法不會如果文件已經存在,則工作。也許嘗試不同的方法,如此示例:

Writer writer = null; 
try { 
    OutputStream out = mContext.openFileOutput(dataFileName, Context.MODE_PRIVATE); 
    writer = new OutputStreamWriter(out); 

    for (int i = 0; i < traces.size(); i++) { 
     double time = traces.get(i).time; 
     float x = traces.get(i).x, y = traces.get(i).y, z = traces.get(i).z; 
     writer.write(time + ";" + x + ";" + y + ";" + z + ";"); 
    } 
} 
finally { 
    if (writer != null) { 
     writer.close(); 
    } 
} 
+0

噢,我的,這是一個簡單的錯誤......> _>我在全局初始化它,修復了異常,但仍然無法正確讀寫。 –

相關問題