2010-05-24 88 views
2

我有以下代碼:從Android的傳感器獲取的數據,而不聽衆

public class readSensorsData extends Activity implements SensorListener { 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    sm = (SensorManager) getSystemService(SENSOR_SERVICE);  

} 
@Override 
public void onSensorChanged(int sensor, float[] values) { 
    synchronized (this) { 
     if (sensor == SensorManager.SENSOR_ORIENTATION) { 

     //get orientation  

     } 
     if (sensor == SensorManager.SENSOR_ACCELEROMETER) { 

     //get acceleration 
      }     

     } 
     if (sensor == SensorManager.SENSOR_MAGNETIC_FIELD) { 

     //get magnetic fiels 
      }  
    Bundle bundle = new Bundle(); //results from activity 
    bundle.putFloatArray("acceleration", array); 

    Intent mIntent = new Intent(); 
    mIntent.putExtras(bundle); 
    setResult(RESULT_OK, mIntent); 
    finish(); 
     } 

    public void onAccuracyChanged(int sensor, int accuracy) { 

    } 

@Override 
protected void onResume() { 
    super.onResume(); 
    sm.registerListener(this, 
      SensorManager.SENSOR_ORIENTATION | 
     SensorManager.SENSOR_ACCELEROMETER | 
     SensorManager.SENSOR_MAGNETIC_FIELD, 
      SensorManager.SENSOR_DELAY_NORMAL); 
} 

@Override 
protected void onStop() { 
    sm.unregisterListener(this); 
    super.onStop(); 


    } 
} 

代碼工作,但在這裏不用我的問題:當我這樣稱呼它從主要活動:

 Intent i = new Intent(this, readSensorsData.class); 
    startActivityForResult(i, 1); //1 is for sensors  
    for(int j=0;j<10;j++) 
    { 
       //do sth else here!!!! 
     try { 
     Thread.sleep(1000); 
     } catch (InterruptedException e) {e.printStackTrace();} 
     //here code for showing result from sensor activity 

    } 

然後我可以看到10次'做別的事!當循環結束時,我可以看到活動結果。因此,傳感器活動等待某種原因,然後當主要活動無關時,傳感器正在完成其工作。

當然

我有很好的落實:onActivityResult(INT requestCode,INT resultCode爲,意圖意圖)

我想直接讀取sensord數據,不使用監聽器,這可能嗎?

回答

2

首先,從不在主應用程序線程中調用Thread.sleep()

其次,startActivityForResult()是異步的。當startActivityForResult()返回時,其他活動不會開始。

第三,傳感器事件是異步的。

所以傳感器活動等待一些 原因

它無法啓動,直到你開出主應用程序線程,它是由您的通話Thread.sleep()捆綁起來的。

然後當主要活動沒有任何東西時 做,傳感器正在做他們的工作。

準確地說。

我想直接讀取sensord數據, 不使用監聽器,可以嗎?

不,只要正確使用聽衆。顯示使用傳感器監聽器的Here are three sample projects

+0

在這些例子中,你只需要使用1個傳感器的活動 我想發送使用Wi-Fi包的信息包括,方向,加速等,所以除了我不能使用thread.sleep()我的事實仍然不知道如何從傳感器獲取數據,我可以多次調用startActivityForResult,讓循環1000次,開始這個sctivity和摧毀..等等。在我看來它效率不高,所以我該如何解決它?也許使用服務? – questioner 2010-05-24 13:09:42

+0

嗯,我想我知道,我只是使用線程來使用這個傳感器 – questioner 2010-05-24 13:13:12

+0

如果你想聚合或平均數據超過1000報告,只需將它們附加到ArrayList或'onSensorChanged()'的東西。當第1000份報告進入時,然後使用「AsyncTask」執行計算(如果有)並將數據發送到服務器。 – CommonsWare 2010-05-24 13:45:53