如何延迟方法调用直到另一个方法先完成
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;
}
日志输出
08-08 20:48:19.406 25518-25518/com.example.worldwide.wzakerapp
V/PrayerFragment: onCreateLoader 在这里调用了查询 null
08-08 20:48:19.406 25518-25518/com.example.worldwide.wzakerapp
V/PrayerFragment: onCreateLoader 在这里调用了查询 null
08-08 20:48:19.634 25518-25518/com.example.worldwide.wzakerapp
V/PrayerFragment: onConnected 调用 true
08-08 20:48:19.645 25518-25518/com.example.worldwide.wzakerapp
V/PrayerFragment: 请求位置
08-08 20:48:19.652 25518-25518/com.example.worldwide.wzakerapp
V/PrayerFragment: 纬度为 30.8567497
08-08 20:48:19.652 25518-25518/com.example.worldwide.wzakerapp
V/PrayerFragment: 经度为 30.8001775
为什么不直接从 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);
}
我正在使用 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;
}
日志输出
08-08 20:48:19.406 25518-25518/com.example.worldwide.wzakerapp V/PrayerFragment: onCreateLoader 在这里调用了查询 null
08-08 20:48:19.406 25518-25518/com.example.worldwide.wzakerapp V/PrayerFragment: onCreateLoader 在这里调用了查询 null
08-08 20:48:19.634 25518-25518/com.example.worldwide.wzakerapp V/PrayerFragment: onConnected 调用 true
08-08 20:48:19.645 25518-25518/com.example.worldwide.wzakerapp V/PrayerFragment: 请求位置
08-08 20:48:19.652 25518-25518/com.example.worldwide.wzakerapp V/PrayerFragment: 纬度为 30.8567497
08-08 20:48:19.652 25518-25518/com.example.worldwide.wzakerapp V/PrayerFragment: 经度为 30.8001775
为什么不直接从 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);
}