私はiOS開発者から来ており、Androidでクロージャを正しく実装しているかどうかを知りたいと思っています。AndroidのiOSクローズ/コールバックと同等のことを理解する方法
これは私が複製する私の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コードを勉強した後、私は論理の流れを得ると思う。 1つのq:「匿名のクラス」は何ですか?私はそれを使用していますか? 2番目のQ:もし私が多くのクラスでクロージャを持っていれば、たくさんのインターフェースファイルを持っているというわけではありませんか?それは少し組織化されていない/扱いにくいですか? – makthrow
MeetActivityInterface(){}と入力すると、MeetActivityInterfaceインターフェイスを実装する新しいクラスが定義されます。 {}の間のコードは、通常の実装と同様に、クラスの実装です。あなたはそれに名前を付けなかったので、これは匿名クラスと呼ばれます。次に、新しいキーワードを使用して新しいインスタンスを作成します。そしてその関数へのパラメータとして渡されます。呼び出す関数はオブジェクトとして認識し、必要に応じて他のパラメータと同様に関数を呼び出すことができます。 –