这是在创建GoogleApiClient时调用的代码。所有这一切都会检索用户的最后位置。
//omitted code
@Override
public void onConnected(Bundle bundle) {
Location location = LocationServices.FusedLocationApi.getLastLocation(mApiClient);
if (location != null) {
mLongitude = String.valueOf(location.getLongitude());
mLatitude = String.valueOf(location.getLatitude());
Log.d(TAG, mLongitude + "___" + mLatitude); //this one doesn't return null
} else {
Log.d(TAG, "Location is null");
LocationServices.FusedLocationApi.requestLocationUpdates(mApiClient, mLocationRequest, this);
}
}
这适用于google api客户端:
private void buildGoogleApiClient() {
mApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
这段代码来自我的onCreate()方法:
buildGoogleApiClient();
Log.d(TAG, mLongitude + "___" + mLatitude); //this one returns null
因此,当代码运行时,我构建一个google api客户端并调用onConnected方法。在该方法内部,我将更新作为实例变量的mLongitude和mLatitude变量。但是在日志中,它们返回null。我想知道为什么会这样,所以我把另一个日志INSIDE我的onConnected()方法的if语句,你可以在第一个代码块中看到,这个成功地带回了经度和纬度。我不知道为什么它不更新实例变量。我相信它是因为回调没有在主线程上运行,所以日志发生在更新之前。所以我尝试在主线程中运行代码,如下所示:
runOnUiThread(new Runnable() {
@Override
public void run() {
buildGoogleApiClient();
}
});
Log.d(TAG, mLongitude + "___" + mLatitude);
不幸的是,这也不起作用。我搜索了与此主题相关的内容,并尝试在我的代码中实现它们,但似乎没有工作,因为我甚至不知道这个问题的真正原因。
任何人都知道如何解决这个问题?
谢谢
答案 0 :(得分:1)
buildGoogleApiClient
调用是异步的。数据将在稍后返回 - 您的变量将在呼叫完成之前打印。
您需要找到一种等待数据返回的方法。有很多方法可以实现这一点。
编辑:
只是为了验证,您可以在非UI线程上运行循环并等待数据更改......如:
new Runnable() {
@Override
public void run() {
while (mLongitude == null) {
wait(100);
}
Log.d(TAG, mLongitude + "___" + mLatitude);
}
});
您可能希望对其进行优化,但有许多方法可以等待,而不是在UI线程上。但问题是您希望在数据可用后对其进行处理。如果您需要更新数据库与UI,那么您将需要不同的实现。从根本上说,它的实现方式与listener
s一样。