это ничего не регистрирует:
getUrlAsync(filepath, resultUri);
Log.d(TAG, "Put File " + mDownloadUri);
потому что Log.d()
выполняется синхронно (он не будет ждать OnCompleteListener
), в то время как getUrlAsync()
будет выполняться асинхронно (независимо от остальной части выполнения).
mDownloadUri
имеет значение только после того, как OnCompleteListener<Uri>
доставил результат ... что это проблема синхронизации, основанная на синхронном и асинхронном выполнении, может быть легко доказана ожиданием:
getUrlAsync(filepath, resultUri);
while(this.mDownloadUri == null) {
Thread.sleep(100); // this obviously is not the answer.
Log.d(TAG, "mDownloadUri is NULL; awaiting delivery.");
}
Log.d(TAG, "mDownloadUri is: " + this.mDownloadUri);
довольно правильным было бы добавить еще один метод, который обрабатывает результат задачи; например:
public void OnDownloadUri(Uri uri) {
...
}
, а затем перезвоните изнутри OnCompleteListener<Uri>
(с 1-2 обратными вызовами это все еще может быть вложенным, но когда оно становится более сложным, подобные методы действительно могут помочь уменьшить ад обратного вызова).