如何使回调中的实例变量更新发生在主线程中?

时间:2015-10-18 23:53:13

标签: android

这是在创建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);

不幸的是,这也不起作用。我搜索了与此主题相关的内容,并尝试在我的代码中实现它们,但似乎没有工作,因为我甚至不知道这个问题的真正原因。

任何人都知道如何解决这个问题?

谢谢

1 个答案:

答案 0 :(得分:1)

buildGoogleApiClient调用是异步的。数据将在稍后返回 - 您的变量将在呼叫完成之前打印。

您需要找到一种等待数据返回的方法。有很多方法可以实现这一点。

编辑:

只是为了验证,您可以在非UI线程上运行循环并等待数据更改......如:

new Runnable() {
        @Override
        public void run() {
            while (mLongitude == null) {
                wait(100);
            }
            Log.d(TAG, mLongitude + "___" + mLatitude);
        }
    });

您可能希望对其进行优化,但有许多方法可以等待,而不是在UI线程上。但问题是您希望在数据可用后对其进行处理。如果您需要更新数据库与UI,那么您将需要不同的实现。从根本上说,它的实现方式与listener s一样。