gpt4 book ai didi

Android传感器和线程

转载 作者:行者123 更新时间:2023-11-29 14:15:19 24 4
gpt4 key购买 nike

我想创建一个应用程序,其中我的传感器在主线程仍在工作时在另一个线程中获取值。我尝试了另一个线程,但它没有用。我尝试使用服务和 IntentService,但传感器在主线程之后启动。我目前的代码是这样的。

我的服务.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)
{
}

}

监听器.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,而我希望它们一起运行。你能帮帮我吗?

最佳答案

您从 onCreate 方法中启动服务。该方法作为服务初始化,在主线程上运行。这意味着该服务无法在您的 onCreate 运行的同时运行其初始化(更不用说它非常非常快地记录 0-998 - 从您的日志开始 80 毫秒)。

此外,您正在注册听众。即使在您的服务启动后,它们也会被调用。

你不能像那样同步这两个 Action 。 (并且没有足够的细节说明为什么你需要任何同步来为你指明正确的方向)

关于Android传感器和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19117506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com