当前位置: 代码迷 >> Android >> 如何理解与Android中的iOS关闭/回调等效
  详细解决方案

如何理解与Android中的iOS关闭/回调等效

热度:56   发布时间:2023-08-04 11:10:57.0

我来自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);
        }
    });
}

有人可以告诉我我走的路是否正确吗? 我不确定自己在做什么。 谢谢。

首先,小的nitpick-closures不是iOS的功能。 它们是ObjectiveC和Swift语言的功能。 它们也是许多其他语言的功能...只是不是Java。 在Java中,复制它们的方式就像您已经看到的那样-使用所需的函数创建一个接口。 然后,您传入该接口的实例。

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

  相关解决方案