java如何理解Android中iOS闭包/回调的等价物
我来自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);
}
});
}
有人能告诉我我走对了吗?我不太清楚我在做什么。谢谢
# 1 楼答案
首先,小的挑剔闭包不是iOS的特性。它们是Objective和Swift语言的一个特点。它们也是许多其他语言的特征。。。只是不是Java。在Java中,复制它们的方式与您所看到的一样——您使用所需的函数创建一个接口。然后传入该接口的一个实例
您要做的是创建一个实现这些接口的匿名类并将其传入。这是一种常见的处理方法,如果它需要的代码很小,接口是1个或2个函数,并且没有重用,则经常使用这种方法。另一种方法是实际编写一个实现接口的普通类,并在中传递该接口的实例。如果要在多个地方重用同一个实现,通常会使用这种技术