Я иду из iOS dev и хочу знать, правильно ли я внедряю закрытие в Android.Как понять эквивалент закрытия/обратного вызова iOS в Android
Это мой IOS код, который я хочу повторить:
func playVideoAtCell(_ cellNumber: Int) {
if (currentlyPlayingVideo) {return}
getDownloadURL(cellNumber) { (url) in
self.avPlayer = AVPlayer(url: url)
self.avPlayerViewController.player = self.avPlayer
self.avPlayerViewController.showsPlaybackControls = false
NotificationCenter.default.addObserver(self, selector: #selector(self.videoItemFinished(_:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.avPlayer?.currentItem)
self.present(self.avPlayerViewController, animated: true) {() -> Void in
self.avPlayerViewController.player?.play()
}
}
}
func getDownloadURL (_ cellNumber: Int, callback: @escaping (URL) ->()) {
let mediaID = mediaIntroQueueList[cellNumber]["mediaID"] as? String
Constants.storageMediaRef.child("\(mediaID!)").downloadURL(completion: { (URL, error) in
if error != nil {
self.showVideoErrorAlert()
if let indexPath = self.tableView.indexPathForSelectedRow {
self.tableView.deselectRow(at: indexPath, animated: true)
}
}
if let downloadURL = URL {
callback (downloadURL)
}
})
}
Я сделал интерфейс в Java:
public interface MeetActivityInterface {
public void downloadURLCompleted(Uri url);
}
и это мой Java-код в деятельности:
private void playVideoAtCell(int cellNumber){
getDownloadURL(cellNumber, new MeetActivityInterface() {
@Override
public void downloadURLCompleted(Uri url) {
// play video with url
}
});
}
private void getDownloadURL(int cellNumber, final MeetActivityInterface completion) {
String mediaID = mediaIntroQueueList.get(cellNumber).getMediaID();
// firebase storage
Constants.storageMediaRef.child(mediaID).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
{
@Override
public void onSuccess(Uri downloadURL)
{
completion.downloadURLCompleted(downloadURL);
}
});
}
Может ли кто-нибудь сказать мне, если я на правильном пути? Я не совсем уверен, что я делаю. Благодарю.
Хорошо спасибо, я прочитал ваш ответ и снова взглянул на код и после изучения кода Java некоторое время, я думаю, что получаю логический поток. Один q: Можете ли вы объяснить, что такое «анонимный класс»? Использую ли я это? 2-й вопрос: если у меня есть закрытия во многих разных классах, разве это не означает, что у меня будет много файлов интерфейса? Разве это не получается немного неорганизованным/громоздким? – makthrow
Итак, когда вы вводите MeetActivityInterface() {}, то, что вы делаете, это определение нового класса, реализующего интерфейс MeetActivityInterface. Код между {} - это реализация класса - как обычная реализация. Это называется анонимным классом, потому что вы не дали ему имени. Затем вы создаете новый экземпляр (с новым ключевым словом). И его передают как параметр функции. Функция, которую вы вызываете, просто рассматривает ее как объект и может вызывать на ней функции по мере необходимости, как и с любым другим параметром. –