如何延迟方法调用直到另一个方法先完成

How to delay method call until another method been done first

我正在使用 loader 从互联网上获取数据,并使用 GoogleApiClient 获取用户位置,我通过 string url with location 到加载器构造函数,onCreateLoader 方法在获取用户位置的 onLocationChanged 方法之前调用作为对象

问题是我需要先将 onLocationChanged 方法 return 位置才能将正确的 url 传递给 onCreateLoader 方法。那么,有什么方法可以先 运行 onLocationChanged 方法,或者在创建方法

上延迟加载程序

onCreateLoader代码

    @Override
public android.content.Loader<Adhan> onCreateLoader(int id, Bundle args) {

    Log.v(LOG_TAG, "onCreateLoader invoked query here " + mQueryUrl);
    if (mQueryUrl != null) {
        return new PrayTimeLoader(getContext(), mQueryUrl);
    }
    return null;
}

onLocationChanged 代码

 @Override
public void onLocationChanged(Location location) {

    mLocation = location;

    makeQueryUrl();


    Log.v(LOG_TAG, "latitude is " + location.getLatitude());
    Log.v(LOG_TAG, "Longitude is " + location.getLongitude());

}

makeQueryUrl代码

private String makeQueryUrl() {

    StringBuilder theQuery = new StringBuilder();

    Long tsLong = System.currentTimeMillis() / 1000;
    String ts = tsLong.toString();

    if (mLocation != null) {


        String latitude = Double.toString(mLocation.getLatitude());
        String longitude = Double.toString(mLocation.getLongitude());

        theQuery.append("http://api.aladhan.com/timings/")
                .append(ts)
                .append("?latitude=")
                .append(latitude)
                .append("&longitude=")
                .append(longitude)
        ;

        Log.v(LOG_TAG, "our url for today is " + theQuery);
    }
    mQueryUrl = String.valueOf(theQuery);
    return mQueryUrl;
}

日志输出

为什么不直接从 onLocationChanged 内部调用加载程序?

void onLocationChanged(Location location) {
    if (location != null) {
        getLoaderManager().initLoader(0, null, this);
    }
}

或者您可以 运行

getLoaderManager().restartLoader(0, null, this);

onLocationChanged() 内部

听起来您正在使用 LoaderManager。我不确定你在哪里初始化它,但尝试在捕获位置后重新初始化加载程序:

@Override
public void onLocationChanged(Location location) {

    mLocation = location;

    makeQueryUrl();

    Log.v(LOG_TAG, "latitude is " + location.getLatitude());
    Log.v(LOG_TAG, "Longitude is " + location.getLongitude());

    getLoaderManager().restartLoader(0, null, this);

}