Question

I want to create an application where my sensors get values in another thread while the main thread is still working. I tried with just another thread, but it didn't working. I tried with a service and a IntentService, but the sensors start after the main thread. My current code is this.

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);
    }
}

My problem is that i get always 1-999 before any proximity/light values, while i want them to run together. Can you help me please?

Was it helpful?

Solution

You start a service from within an onCreate method. That method, as the service initialization, run on the main thread. It means the service cannot run its initialization at the same time as your onCreate is running (not to mention that logging 0-998 it very very fast - 80ms from your log).

Moreover, you are registering listeners. Those will be called even after your service started.

You cannot synchronize those 2 actions like that. (And there is not enough details as to why you need any synchronization at all to point you in the right direction)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top