המתנה בתור

‫Cast Framework מספק מחלקות של תורים שתומכות ביצירת רשימות של מופעים של MediaQueueItem, שאפשר ליצור ממופעים של MediaInfo כמו סטרימינג של סרטונים או אודיו, כדי להפעיל אותם ברצף במכשיר המקבל. אפשר לערוך, לסדר מחדש, לעדכן וכו' את התור הזה של פריטי תוכן.

ה-SDK של מכשיר התצוגה שומר על התור ומגיב לפעולות בתור כל עוד יש בתור פריט אחד לפחות שפעיל כרגע (מופעל או מושהה). השולחים יכולים להצטרף לסשן ולהוסיף פריטים לרשימת הסרטונים. המכשיר המקבל שומר על סשן של פריטים בתור עד שההפעלה של הפריט האחרון מסתיימת, או עד שהמכשיר השולח מפסיק את ההפעלה ומסיים את הסשן, או עד שהמכשיר השולח טוען תור חדש במכשיר המקבל. כברירת מחדל, המקבל לא שומר מידע על תורים שהסתיימו. אחרי שהפריט האחרון בתור מסתיים, סשן המדיה מסתיים והתור נעלם.

יצירה וטעינה של פריטים בתור להפעלת מדיה

פריט בתור להפעלת מדיה מיוצג ב-Cast Framework כמופע של MediaQueueItem. כשיוצרים פריט בתור להפעלת מדיה, אם משתמשים בספריית נגן המדיה עם תוכן דינמי, אפשר להגדיר את זמן הטעינה מראש כדי שהנגן יוכל להתחיל לשמור בזיכרון את הפריט בתור להפעלת מדיה לפני שהפריט שלפניו בתור יסיים את ההפעלה. הגדרת מאפיין ההפעלה האוטומטית של הפריט כ-true מאפשרת למקלט להפעיל אותו באופן אוטומטי. לדוגמה, אפשר להשתמש בתבנית builder כדי ליצור את הפריט בתור להפעלת מדיה באופן הבא:

Kotlin
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

טוענים מערך של פריטים בתור להפעלת מדיה בתור באמצעות ה-method המתאים‏ queueLoad של RemoteMediaClient.

קבלת עדכוני סטטוס של תור המדיה

כשמקלט טוען פריט בתור של מדיה, הוא מקצה לפריט מזהה ייחודי שנשמר למשך הפעלת הסשן (ולמשך הזמן שהתור פעיל). האפליקציה יכולה לדעת מה הסטטוס של התור, כלומר איזה פריט נטען כרגע (יכול להיות שהוא לא מושמע), נטען או נטען מראש. הסטטוס הזה מופיע בכיתה MediaStatus:

  • getPreloadedItemId() method – אם הפריט הבא נטען מראש, הפונקציה מחזירה את מזהה הפריט שנטען מראש.
  • getLoadingItemId() method - Returns the item ID of the item that is currently loading (but isn't active in the queue) on the receiver.
  • getCurrentItemId() method – מחזירה את מזהה הפריט של הפריט שהיה פעיל בתור (יכול להיות שהוא לא מושמע) בזמן שחל שינוי בסטטוס המדיה.
  • getQueueItems() (הוצא משימוש, במקומו יש להשתמש ב-MediaQueue) method – מחזירה את רשימת המופעים של MediaQueueItem כרשימה שלא ניתן לשנות.

האפליקציה יכולה גם לקבל את רשימת הפריטים באמצעות המחלקה MediaQueue. הקטגוריה היא מודל נתונים מפוזר של תור המדיה. הוא שומר את רשימת מזהי הפריטים בתור, והיא מסונכרנת אוטומטית עם המקלט. ‫MediaQueue לא שומר את כל MediaQueueItem כי זה יתפוס יותר מדי זיכרון כשהתור יהיה ארוך מאוד. במקום זאת, המערכת מאחזרת את הפריטים לפי דרישה ושומרת LruCache של פריטים שהייתה אליהם גישה לאחרונה. אפשר להשתמש בשיטות האלה כדי לגשת לתור המדיה:

  • getItemIds() method – מחזירה את רשימת כל מזהי הפריטים לפי הסדר.
  • השיטה getItemAtIndex() מחזירה את הפריט שנשמר במטמון באינדקס נתון. אם הפריט לא נמצא במטמון, ‫MediaQueue יחזיר null ויתזמן שליפה של הפריט. כשהפריט מאוחזר, הפונקציה MediaQueue.Callback#itemsUpdatedAtIndexes() מופעלת, והפעלת הפונקציה getItemAtIndex() עם אותו מזהה שוב תחזיר את הפריט.
  • השיטה fetchMoteItemsRelativeToIndex() משמשת כשהמשתמש גולל את ממשק המשתמש של התור לראש או לתחתית, והאפליקציה רוצה לאחזר עוד פריטים מהענן.

כדאי להשתמש בשיטות האלה יחד עם שיטות אחרות לקבלת סטטוס המדיה, כדי שהאפליקציה תדע מה הסטטוס של התור ושל הפריטים שבו. בנוסף לעדכוני סטטוס של המדיה מהמקלט, האפליקציה יכולה לעקוב אחרי שינויים בתור על ידי הטמעה של RemoteMediaClient.Callback ושל MediaQueue.Callback.

בנוסף, Cast SDK מספק שתי מחלקות כלי עזר ליצירת ממשק משתמש להוספה לתור.

לדוגמה, כדי ליצור RecyclerView באמצעות MediaQueueRecyclerViewAdapter:

Kotlin
class MyRecyclerViewAdapter(mediaQueue: MediaQueue?) :
    MediaQueueRecyclerViewAdapter<MyViewHolder?>(mediaQueue) {
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        val item = getItem(position)

        // Update the view using `item`.
        ...
    }
}

class MyViewHolder : RecyclerView.ViewHolder {
    // Implement your own ViewHolder.
    ...
}

fun someMethod() {
    val adapter = MyRecyclerViewAdapter(
        mCastSession.remoteMediaClient.getMediaQueue())
    val recyclerView =
        activity.findViewById(R.id.my_recycler_view_id) as RecyclerView
    recyclerView.adapter = adapter
}
Java
public class MyRecyclerViewAdapter extends MediaQueueRecyclerViewAdapter<MyViewHolder> {
    public MyRecyclerViewAdapter(MediaQueue mediaQueue) {
        super(mediaQueue);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
      MediaQueueItem item = getItem(position);

      // Update the view using `item`.
      ...
    }
}

public class MyViewHolder implements RecyclerView.ViewHolder {
  // Implement your own ViewHolder.
  ...
}

public void someMethod() {
    RecyclerView.Adapter adapter = new MyRecyclerViewAdapter(
        mCastSession.getRemoteMediaClient().getMediaQueue());
    RecyclerView recyclerView =
        (RecyclerView) getActivity().findViewById(R.id.my_recycler_view_id);
    recyclerView.setAdapter(adapter);
}

עריכת התור

כדי לבצע פעולות על הפריטים בתור, משתמשים בשיטות של התור במחלקה RemoteMediaClient. הפונקציות האלה מאפשרות לטעון מערך של פריטים לתור חדש, להוסיף פריטים לתור קיים, לעדכן את המאפיינים של פריטים בתור, להעביר פריט קדימה או אחורה בתור, להגדיר את המאפיינים של התור עצמו (לדוגמה, לשנות את repeatMode האלגוריתם שבוחר את הפריט הבא), להסיר פריטים מהתור ולשנות את הסדר של הפריטים בתור.