问题
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?
回答1:
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)
来源:https://stackoverflow.com/questions/19117506/android-sensors-and-thread