2012-08-24 46 views
0

我檢查了幾乎相同標題的其他類似標籤。這些答案無關設置數組中的一個元素會改變其他元素

將元素設置在數組的一個位置時,兩個元素的值都相同。

公共類LogActivity延伸活動 {

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    startStopButton = (Button) findViewById(R.id.btnStart); 
    loggingStatusText = (TextView) findViewById(R.id.logStatusText); 
    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); 
    sensorValues=new ArrayList<float[]>(sensorList.size()); 
    sensorValsArray=new float[sensorList.size()][]; 
    sensorNameList = new ArrayList<String>(); 
    selectedSensorNames = new ArrayList<String>(); 
    for (Sensor itemSensor : sensorList) 
    { 
     if (itemSensor != null) 
     { 
      sensorNameList.add(itemSensor.getName()); 
     } 
    } 
    showSensorList(); 
} 



private void showSensorList() 
{ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setIcon(R.drawable.ic_launcher); 
    builder.setMultiChoiceItems((CharSequence[]) sensorNameList 
      .toArray(new CharSequence[sensorNameList.size()]), 
      new boolean[sensorNameList.size()], 
      new DialogInterface.OnMultiChoiceClickListener() 
      { 
       public void onClick(DialogInterface dialog, 
         int whichButton, boolean isChecked) 
       { 
        if (isChecked) 
        { 
         if (!selectedSensorNames.contains(sensorNameList 
           .get(whichButton))) 
          selectedSensorNames.add(sensorNameList 
            .get(whichButton)); 
        } else 
        { 
         if (selectedSensorNames.contains(sensorNameList 
           .get(whichButton))) 
         { 
          selectedSensorNames.remove(sensorNameList 
            .get(whichButton)); 
         } 
        } 
       } 

      }); 
    builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() 
    { 
     public void onClick(DialogInterface dialog, int whichButton) 
     {    
      listeners=new SensorEventListener[selectedSensorNames.size()]; 
      float[] tempVals = new float[] { 0, 0, 0 }; 
      for (int i = 0; i < selectedSensorNames.size(); i++) 
      { 
       sensorValsArray[i]=tempVals; 
      }    
      showRateList(); 
     } 
    }); 
    builder.setCancelable(false); 
    builder.create().show(); 

} 





void registerSensors() 
{ 
    for (Sensor sensor : sensorList) 
    { 
     if (selectedSensorNames.contains(sensor.getName())) 
     { 
      mSensorManager.registerListener(listeners[selectedSensorNames.indexOf(sensor.getName())], sensor, selectedDelay); 
     } 
    } 
} 

class SchedulerTask extends TimerTask 
{ 
    /* 
    * The task to run should be specified in the implementation of the 
    * run() method 
    */ 
    public void run() 
    { 
     logSensorData(); 
    } 
} 

private void createLog(String fileName) 
{ 
    File root = getExternalFilesDir(null);// Get the Android external 
    // storage directory 

    Date cDate = new Date(); 
    String bstLogFileName = fileName; 
    bstLogFile = new File(root, bstLogFileName);// Construct a new file for 
    // using the specified 
    // directory and name 
    FileWriter bstLogWriter; 
    logScheduler = new Timer();// Create a new timer for updating values 
    // from content provider 
    logScheduler.schedule(new SchedulerTask(), 
      LOG_TASK_DELAY_IN_MILLISECONDS, 
      getLogPeriodInMilliSeconds(selectedDelay)); 

} 

public void logSensorData() 
{ 
    Date stampDate = new Date(); 
    String LogPack ="\r\n"; 
    for (int count=0;count<selectedSensorNames.size();count++) 
    { 
     LogPack += sensorValsArray[count][0] + "," + sensorValsArray[count][1] + "," + sensorValsArray[count][2] + ","; 
    } 
    LogPack += "\r\n"; 

    try 
    { 
     F_StreamWriter.write(LogPack); 
     F_StreamWriter.flush(); 
    } 

    catch (IOException e) 
    { 
    } 

    catch (NullPointerException e) 
    { 
    } 
} 



public void startStopLog(View v) 
{ 
    if (startStopButton.getText().equals("Start")) 
    { 
     createSensorListeners(); 
     registerSensors(); 
     showFilenameDialog();   
    } else if (startStopButton.getText().equals("Stop")) 
    { 
     stopLog(); 
    } 

} 

public void startLog(String fileName) 
{ 
    createLog(fileName); 
} 



public void stopLog() 
{ 
    logScheduler.cancel(); 
    logScheduler.purge();  
    for(int i=0;i<listeners.length;i++) 
     mSensorManager.unregisterListener(listeners[i]); 
} 

private void showFilenameDialog() 
{ 
    final Dialog dialog = new Dialog(this); 
    dialog.setContentView(R.layout.custom_text_input_dialog); 
    dialog.setCancelable(true); 
    final EditText fileNameInput = (EditText) dialog 
      .findViewById(R.id.fileNameText); 
    Button button = (Button) dialog.findViewById(R.id.okButton); 
    button.setOnClickListener(new OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
       startLog(nameInput); 
       dialog.dismiss(); 
     } 
    }); 
    dialog.show(); 

} 


private void createSensorListeners() 
{ 
    listeners=new SensorEventListener[selectedSensorNames.size()];  
    for (int i = 0; i < selectedSensorNames.size(); i++) 
    { 
     listeners[i]=new SensorEventListener() 
     { 

      @Override 
      public void onSensorChanged(SensorEvent event) 
      { 
       sensorValsArray[selectedSensorNames.indexOf(event.sensor.getName())]=event.values; 

      } 

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


      } 
     }; 
    } 
} 

}

當索引爲0,則執行設置命令時,它也改變索引位置的值 '1'。 任何人都可以幫助我嗎?

由於提前, Dheepak

+1

索引在哪裏申報? – Vikdor

+0

@Vikdor 假設索引在每個調用期間在0和1之間變化 – Dheepak

+0

如果這是一個多線程程序,那麼索引可能會被多線程損壞,所以此方法不是線程安全的。 – Vikdor

回答

2

當索引爲0,當執行設置命令時,它也改變索引位置的值「1」。誰能幫我這個?

你肯定是錯誤的,它是什麼造成了這一點。在ArrayList的一個位置設置值不會神祕地導致另一個位置的值發生變化。這根本就不行。

你觀察會因別的東西的影響:

  • 可能的index值是不是您所期望
  • 什麼可能的event.values值不是你期望的。 (也許你已經取得了您創建的Event對象的方式錯誤,而且都是共享一個float[]對象。)
  • 說不定在位置1的值已經是價值
  • 也許你有多個線程更新sensorValues列表。
+0

指標值是預期的。但在寫入數組時,它不會寫入預期的索引位置。 – Dheepak

+0

我剛查過。這個問題只發生在少數設備上。它可以在HTC Salsa(薑餅),LG Optimus(薑餅),Samsung Galaxy Tab(蜂巢)中正常工作。 Galaxy Nexus(JellyBean)和Galaxy Note(JellyBean)出現問題。這是否與操作系統有關? – Dheepak

+0

這是可能的,但我認爲你會更好地理解我在我的答案中所說的話。 –

相關問題