2017-02-13 3 views
0

私は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); 
     } 
    }); 
} 

私は正しい道にいるかどうか誰かに教えてもらえますか?私は何をやっているのか正確には分からない。ありがとう。

答えて

0

第1に、小さなニトロクロージャはiOSの機能ではありません。これらはObjectiveCとSwift言語の機能です。それらはまた、他の多くの言語の機能です... Javaだけではありません。 Javaでは、それらを複製する方法は見たようなものです。必要な機能を備えたインタフェースを作成します。次に、そのインタフェースのインスタンスを渡します。

これらのインターフェイスを実装して渡す匿名クラスを作成しています。これは一般的なやり方で、必要なコードが小さい場合はよく使用され、インターフェイスは1または2の関数で、再利用はありません。これを行うもう1つの方法は、実際にインターフェイスを実装する通常のクラスを作成し、そのインスタンスを渡すことです。この手法は、同じ実装を複数の場所で再利用する場合に一般的に行われます。

+0

ありがとう、私はあなたの答えを読んで、コードをもう一度見て、しばらくの間Javaコードを勉強した後、私は論理の流れを得ると思う。 1つのq:「匿名のクラス」は何ですか?私はそれを使用していますか? 2番目のQ:もし私が多くのクラスでクロージャを持っていれば、たくさんのインターフェースファイルを持っているというわけではありませんか?それは少し組織化されていない/扱いにくいですか? – makthrow

+0

MeetActivityInterface(){}と入力すると、MeetActivityInterfaceインターフェイスを実装する新しいクラスが定義されます。 {}の間のコードは、通常の実装と同様に、クラスの実装です。あなたはそれに名前を付けなかったので、これは匿名クラスと呼ばれます。次に、新しいキーワードを使用して新しいインスタンスを作成します。そしてその関数へのパラメータとして渡されます。呼び出す関数はオブジェクトとして認識し、必要に応じて他のパラメータと同様に関数を呼び出すことができます。 –

関連する問題