我正在阅读一些处理gps坐标的android服务代码,并使用新的Object设置AtomicReference一次:
public class SingleLocationUpdateService extends ServicePart {
private final AtomicReference<GPSUpdater> currentUpdater = new AtomicReference<>();
@Override
protected boolean onStart() {
lastSaverModeOn = mService.getSettings().getRootSettings().isSaverModeOn();
if (mService.getSettings().getRootSettings().isStopMileageInWorkOn()) {
if (lastSaverModeOn) {
return false;
}
}
singleUpdateSeconds = mService.getSettings().getRootSettings().getGpsRareUpdateSeconds();
***currentUpdater.set(new GPSUpdater());***
mService.getExecutor().schedule(currentUpdater.get(), 10, TimeUnit.SECONDS);
return true;
}
然后sheduler执行此操作:
private class GPSUpdater implements Runnable, LocationListener {
@Override
public void run() {
if (!isCurrentRunning()) {
return;
}
Log.d(TAG, "Requesting single location update");
final LocationManager lm = (LocationManager) mService.getSystemService(Context.LOCATION_SERVICE);
try {
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this, Looper.getMainLooper());
} catch (Throwable t) {
Log.e(TAG, "Failed to request single location update", t);
}
reschedule();
}
private boolean isCurrentRunning() {
return isStarted() && currentUpdater.get() == GPSUpdater.this;
}
private void reschedule() {
final LocationManager lm = (LocationManager) mService.getSystemService(Context.LOCATION_SERVICE);
lm.removeUpdates(this);
final GPSUpdater next = new GPSUpdater();
if (isStarted() && currentUpdater.compareAndSet(GPSUpdater.this, next)) {
Log.d(TAG, "Rescheduling single location updater");
mService.getExecutor().schedule(next, 10, TimeUnit.SECONDS);
}
}
在调试器中,如果我运行currentUpdater.compareAndSet(GPSUpdater.this,next)1次,则返回true,因此表示新的GPSUpdater(在onStart()中设置)== GPSUpdater.this。然后将AtomicReference设置为next。但接下来也是新的GPSUpdater。但是,如果你2当时使用currentUpdater.compareAndSet(GPSUpdater.this,next),它将返回false。所以2次新的GPSUpdater!= GPSUpdater.this。如何正确解释?如果我创建2个新的对象引用 - 只有第一个将等于它的类引用?为什么? Thx提前。
答案 0 :(得分:0)
您正在通过呼叫每个人new GPSUpdater()
创建两个不同的类GPSUpdater对象。因此,如果要比较两个对象,最好使用equals()方法。如果您自己编写了GPSUpdate类,则可能需要覆盖equals()
方法以产生适当的结果。我的意思是,如果定义两个对象相等,则equals应该返回true。
如果您使用==
运算符来检查两个对象是否相同,那么将检查引用而不是真实的&#34;内容&#34;对象