有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    首先,小的挑剔闭包不是iOS的特性。它们是Objective和Swift语言的一个特点。它们也是许多其他语言的特征。。。只是不是Java。在Java中,复制它们的方式与您所看到的一样——您使用所需的函数创建一个接口。然后传入该接口的一个实例

    您要做的是创建一个实现这些接口的匿名类并将其传入。这是一种常见的处理方法,如果它需要的代码很小,接口是1个或2个函数,并且没有重用,则经常使用这种方法。另一种方法是实际编写一个实现接口的普通类,并在中传递该接口的实例。如果要在多个地方重用同一个实现,通常会使用这种技术