המתנה בתור

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

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

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

פריט בתור של מדיה מיוצג ב-Cast framework כמכונה MediaQueueItem. כשיוצרים פריט בתור מדיה, אם משתמשים בספרייה של Media Player עם תוכן מותאם, ניתן להגדיר את זמן הטעינה מראש כך שהנגן יוכל להתחיל לאחסן את הפריט בתור המדיה לפני שהפריט שלפניו בתור יסתיים לפעול. אם מאפיין ההפעלה האוטומטית של הפריט מוגדר כ-True, לנמען יש אפשרות להפעיל אותו באופן אוטומטי. לדוגמה, ניתן להשתמש ב-builder ב-builder כדי ליצור את הפריט בתור של המדיה באופן הבא:

קוטלין
val queueItem: MediaQueueItem = MediaQueueItem.Builder(mediaInfo)
    .setAutoplay(true)
    .setPreloadTime(20.0)
    .build()
Java
MediaQueueItem queueItem = new MediaQueueItem.Builder(mediaInfo)
  .setAutoplay(true)
  .setPreloadTime(20)
  .build();

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

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

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

  • getPreloadedItemId() – אם הפריט הבא כבר נטען מראש, הפונקציה מחזירה את מזהה הפריט שנטען מראש.
  • getLoadingItemId() – מחזירה את מזהה הפריט של הפריט שנטען כרגע (אבל לא פעיל בתור) במקבל.
  • method getCurrentItemId() – מחזירה את מזהה הפריט של הפריט שהיה פעיל בתור (יכול להיות שהוא לא מופעל) בזמן השינוי של סטטוס המדיה.
  • getQueueItems() (השיטה הוצאה משימוש, יש להשתמש במקום זאת ב-MediaQueue) – מחזירה את הרשימה של MediaQueueItem מכונות כרשימה שלא ניתנת לשינוי.

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

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

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

כמו כן, ב-Cast SDK יש שתי מחלקות של שירות כדי ליצור ממשק משתמש עבור התור.

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

קוטלין
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 שבוחר את הפריט הבא), להסיר פריטים מהתור ולשנות את הסדר של הפריטים בתור.