2013-10-01 139 views
2

我想創建一個應用程序,在主線程仍在工作時,我的傳感器在另一個線程中獲取值。我嘗試了另一個線程,但它沒有工作。我嘗試了一個服務和一個IntentService,但傳感器在主線程之後啓動。我目前的代碼是這樣的。Android傳感器和線程

MyService.java

public class MyService extends IntentService implements SensorEventListener 
{ 
    public MyService() 
    { 
     super("MyService"); 
    } 

    Sensor mLight; 
    SensorManager mSensorManager; 
    float max; 
    float currentLux; 
    float currentProx; 

    @Override 
    public IBinder onBind(Intent intent) 
    { 
     Log.d("Service", "On bind"); 
     return null; 
    } 

    @Override 
    public void onCreate() 
    { 
     Log.d("Service", "On create"); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) 
    { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) 
    { 
     if(event.sensor.getType() == Sensor.TYPE_LIGHT) 
     { 
      currentLux=(int) event.values[0]; 
      float perc=(float) ((currentLux*100)/max); 
      Log.d("Light", String.valueOf(perc)); 
     } 
     else if(event.sensor.getType() == Sensor.TYPE_PROXIMITY) 
     { 
      currentProx=(int) event.values[0]; 
      Log.d("Proximity", String.valueOf(currentProx)); 
     } 
    } 

    @Override 
    public void onDestroy() 
    { 
     Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show(); 
     Log.d("Service", "On stop"); 
     mSensorManager.unregisterListener(this); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) 
    { 
     Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show(); 
     Log.d("Service", "On start"); 
    } 

    @Override//here u should register sensor and write onStartCommand not onStart 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
     mSensorManager.registerListener(this, mSensorManager 
       .getDefaultSensor(Sensor.TYPE_LIGHT), 
       SensorManager.SENSOR_DELAY_FASTEST); 
     mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); 
     mSensorManager.registerListener(this, mSensorManager 
       .getDefaultSensor(Sensor.TYPE_PROXIMITY), 
       SensorManager.SENSOR_DELAY_FASTEST); 
     max=mLight.getMaximumRange(); 
     Log.d("MAX=", String.valueOf(max)); 
     return Service.START_STICKY; 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
    } 

} 

Listeners.java

public class Listeners extends Activity implements OnClickListener 
{ 
    Button button0; 
    Intent listenersIntent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.listeners); 
     lista= new ArrayList<Float>(); 
     button0 = (Button) findViewById(R.id.button0); 
     button0.setOnClickListener(this); 
     listenersIntent = new Intent(this, MyService.class); 
     startService(listenersIntent); 
     for (int i=0; i<999; i++) 
      Log.d("Main", String.valueOf(i)); 
    } 

    @Override 
    public void onClick(View arg0) 
    { 
     stopService(listenersIntent); 
    } 
} 

我的問題是,我總是得到1-999之前的任何接近/光值,而我希望他們能一起運行。你能幫我嗎?

+0

如果你打算重寫onstart和oncreate它,你爲什麼要擴展intentservice? – njzk2

+0

我刪除了這兩種方法,但在傳感器啓動前我總是得到1-999 –

+0

不能發佈日誌嗎? – njzk2

回答

-1

您從onCreate方法中啓動服務。該方法作爲服務初始化在主線程上運行。這意味着服務無法在您的onCreate正在運行的同時運行它的初始化(更不用說記錄0-998它非常快速 - 距離日誌80毫秒)。

此外,您正在註冊偵聽器。即使在您的服務開始後,這些將會被調用。

你不能同步那2個動作。 (並沒有足夠的細節,爲什麼你需要任何同步指向你在正確的方向)

+0

我想在另一個應用程序中使用此代碼並從頭開始在後臺運行它,所以我試圖使用它來查看是否我的聽衆在後臺工作,但即使我使用線程或服務,我無法得到它的工作。 –

+0

你的聽衆在後臺工作,你應該儘可能快地從onCreate返回,因爲它在主線程上運行。現在,我不明白你的問題。 – njzk2

+0

我也這麼認爲,但我在其他應用程序(gps偵聽器和這些偵聽器)中使用偵聽器類,但只有gps工作,沒有返回任何光/接近度值。 –