2017-01-25 4 views
1

私は技術者コードの問題に直面しています。 TotalAccelerateからトグルボタンを使って私の.txtファイルにすべての値を書きたいと思います。ボタンを一度トグルすると、コードは一度に1つの値だけを書き込んでいます。手動でファイルへの書き込みと書き込みを停止するにはどうすればよいですか? ありがとうございます。あなたのプログラムの開始に加速度センサーからファイルへの書き込み - アンドロイド

list = new ArrayList<Double>();

移動し、この、あなたが書かれていたら、リストを空にする - を:

FileOutputStream fileOutputStream; 
double TotalAccelerate; //I made it global variable 
ArrayList<Double> list; 

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

    list = new ArrayList<Double>(); 

    //for Accelermeter 
    sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    sensorText = (TextView) findViewById(R.id.sensor); 
    accelermeter = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    sm.registerListener(this, accelermeter, SensorManager.SENSOR_DELAY_NORMAL); 
    mDetector = new GestureDetectorCompat(this, new MyGestureListener()); 


    String state = Environment.getExternalStorageState(); 
    if (Environment.MEDIA_MOUNTED.equals(state)) { 
     File Root = Environment.getExternalStorageDirectory(); 
     File dir = new File(Root.getAbsolutePath() + "/MyApp"); 
     if (!dir.exists()) { 
      dir.mkdir(); 
     } 
     File file = new File(dir, "MyMessage.txt"); 
     try { 
      fileOutputStream = new FileOutputStream(file, true); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } else { 
     Toast.makeText(getApplicationContext(), "SDcard not found", Toast.LENGTH_LONG).show(); 
    } 

    OnStore = (ToggleButton) findViewById(R.id.onStore); 
    OnStore.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (OnStore.isChecked()){ 
       try { 
        for(TotalAccelerate : list){ 
         String space = "\n"; 
         byte[] convert = space.getBytes(); 
         fileOutputStream.write(convert); 
         String finalData; 
         finalData = String.valueOf(TotalAccelerate); 
         fileOutputStream.write(finalData.getBytes()); 
        } 
        Toast.makeText(getApplicationContext(), "Message saving", Toast.LENGTH_LONG).show(); 

       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

      }if (!OnStore.isChecked()){ 
       try { 
        fileOutputStream.flush(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       try { 
        fileOutputStream.close(); 
        //added 
        list.clear(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       Toast.makeText(getApplicationContext(),"Message Stopped.",Toast.LENGTH_LONG).show(); 

      } 


     } 

    }); 
}// end OnCreate method 

//Find the total acccerleration from the three sensors, 
    then write the values into a file for off-line analysis 
@Override 
public final void onSensorChanged(SensorEvent event) { 
    // The light sensor returns a single value. 
    // Many sensors return 3 values, one for each axis. 
    double xx = event.values[0]; 
    double yy = event.values[1]; 
    double zz = event.values[2]; 
    TotalAccelerate = Math.round(Math.sqrt(Math.pow(xx, 2) 
      + Math.pow(yy, 2) 
      + Math.pow(zz, 2))); 
    Log.i(DEBUG, "Accelerometer = " + TotalAccelerate); 

    // list = new ArrayList<Double>(); 
    list.add(TotalAccelerate); 
    findPeaks(list); 
    sensorText.setText("Total: " + list); 
    Log.i(DEBUG, "Total " + list); 

} 
+0

ブール値を使用し、クリック時にその状態を切り替えます。ブール値がtrueに設定されている場合、センサー変更イベントの内部に書き込み関数を実装します。 – uguboz

答えて

0

あなたはラインで、センサーが変化し、新しいリストを毎回作成していますそれをファイルに追加します。また、リストが変更された場所を同期する必要があります。

+0

コードを更新しました。私はリストを移動し、toggleButtonのチェックを外すと** list.clear()**を追加しました。これは私が何をする必要があるのでしょうか?私はまだそれを取得していない、何を意味する**あなたはまた、リストが変更されている場所を同期する必要があります**?ありがとうございました –

+0

@ Android-meそれは今動作するのですか?再:同期、*非常に*短い答えは、通常、リストを変更するすべての場所を 'synchronized(list){}'で囲みます。私はより詳細な答えのためにGoogleをしたい。 –

+0

はい、今働いています、私はリストを同期する方法をGoogleにします。ありがとうございました。 –

関連する問題