2017-02-13 1 views
0

Я иду из iOS dev и хочу знать, правильно ли я внедряю закрытие в Android.Как понять эквивалент закрытия/обратного вызова 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); 
     } 
    }); 
} 

Может ли кто-нибудь сказать мне, если я на правильном пути? Я не совсем уверен, что я делаю. Благодарю.

ответ

0

Во-первых, небольшие замки-ниппели не являются особенностью iOS. Они являются признаком языков ObjectiveC и Swift. Они также являются особенностью многих других языков ... просто не Java. В Java способ их репликации, как вы видели, - создать интерфейс с требуемыми функциями. Затем вы передаете экземпляр этого интерфейса.

Что вы делаете, это создать анонимный класс, который реализует эти интерфейсы и передает его. Это обычный способ делать вещи и часто использовать, если необходимый ему код мал, интерфейс - 1 или 2 функции, и повторного использования нет. Другой способ сделать это - на самом деле написать нормальный класс, который реализует интерфейс и передает экземпляр этого. Этот метод обычно выполняется, если вы собираетесь повторно использовать одну и ту же реализацию в нескольких местах.

+0

Хорошо спасибо, я прочитал ваш ответ и снова взглянул на код и после изучения кода Java некоторое время, я думаю, что получаю логический поток. Один q: Можете ли вы объяснить, что такое «анонимный класс»? Использую ли я это? 2-й вопрос: если у меня есть закрытия во многих разных классах, разве это не означает, что у меня будет много файлов интерфейса? Разве это не получается немного неорганизованным/громоздким? – makthrow

+0

Итак, когда вы вводите MeetActivityInterface() {}, то, что вы делаете, это определение нового класса, реализующего интерфейс MeetActivityInterface. Код между {} - это реализация класса - как обычная реализация. Это называется анонимным классом, потому что вы не дали ему имени. Затем вы создаете новый экземпляр (с новым ключевым словом). И его передают как параметр функции. Функция, которую вы вызываете, просто рассматривает ее как объект и может вызывать на ней функции по мере необходимости, как и с любым другим параметром. –

Смежные вопросы