android - 如何使用 Youtube API 在 RecyclerView 中加载 Youtube 缩略图

标签 android youtube youtube-api adaptor

我正在尝试在 RecyclerView 中加载 Youtube 视频缩略图。我遇到了一些问题。

这是我在适配器中所做的:

public static class ItemViewHolder extends RecyclerView.ViewHolder {

    private YouTubeThumbnailView thumb;
    public  Post                 post;

    public ItemViewHolder(View v) {
        thumb = (YouTubeThumbnailView) v.findViewById(R.id.youtube_thumbnail);
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        if (holder instanceof ItemViewHolder) {

            ((ItemViewHolder) holder).thumb.initialize(YOUTUPEKEY, new YouTubeThumbnailView.OnInitializedListener() {
                @Override
                public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader youTubeThumbnailLoader) {
                    youTubeThumbnailLoader.setVideo(VIDEOID);

                }

                @Override
                public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) {

                }});
}}}

它工作正常,但我不这样做是正确的。当我在另一个 Activity 中使用相同的适配器时,我收到此错误:

Activity com.example.yasser.version6.Mespublications has leaked ServiceConnection com.google.android.youtube.player.internal.r$e@4252bcb8 that was originally bound here

加载缩略图需要时间,有时在滑动时会在它们之间混合。

我添加了一个释放所有 Youtube 加载器的功能:

public void ReleaseLoaders() {
    for (YouTubeThumbnailLoader loader : loaders.values()) {
        loader.release();
    }
}

我从 Activity Onstop() 调用这个函数:

@Override
public void onStop() {
    super.onStop();
    mAdapter.ReleaseLoaders();
}

它在一段时间内运行良好,但有时会崩溃。

最佳答案

你可以试试这个吗?它不使用 API,但速度很快。

使用 Picasso 从此 URL 将图像加载到回收站 View 中:

https://img.youtube.com/vi/ “这是你的视频 ID”/default.jpg

-- 编辑--

经过一些研究和实验:

要获得默认的全尺寸缩略图,请执行此操作而不是 default.jpg

https://img.youtube.com/vi/ "这是你的视频 ID"/0.jpg

这里是链接:http://www.reelseo.com/youtube-thumbnail-image/

编辑 2:

刚刚在 SO 中发现有人已经通过这个快速简便的解决方案给出了像我这样的答案,并且有更多的解释和选项可供您选择。

How do I get a YouTube video thumbnail from the YouTube API?


最终编辑:

这是工作代码。我最近使用 api 制作了一个应用程序,所以我发现了你收到错误的原因。这是因为您没有正确释放加载程序。

您可以通过两种方式释放 loader/loaders。

第一

(首选,您将在几秒钟内了解原因) 您可能希望在图像加载到 View 中之后释放它,并且有一个监听器,它称为 OnThumbNailLoadedListener。那就是我发布它的地方(如果你注意下面的代码)。这意味着您不必再处理这个实例了。加载缩略图后,您就完成了。

第二

由于 getView() 一直被调用,因此您必须释放 YouTubeThumbnailLoader 的新实例。这意味着您必须将所有这些存储在一个 ArrayList 中。当 Activity 为 onStop() 时,您只需执行高级 for 循环并在所有这些循环中调用 release;

现在您可能明白为什么首选第一种方式了。而且我知道你做了第二个选项,所以只要让你知道第一个选项总是可以保证工作(至少在我的情况下)。我在 Activity 中使用了 YouTubeSupportFragment,它运行良好。没有任何问题。您绝对可以使第二个选项起作用,但我认为您必须处理很多特殊情况。

final YouTubeThumbnailView youTubeThumbnailView = (YouTubeThumbnailView) convertView.findViewById(R.id.show_episode_thumbnail);
    youTubeThumbnailView.initialize(DeveloperKey.DEVELOPER_KEY, new YouTubeThumbnailView.OnInitializedListener() {
        @Override
        public void onInitializationSuccess(YouTubeThumbnailView youTubeThumbnailView, final YouTubeThumbnailLoader youTubeThumbnailLoader) {
            youTubeThumbnailLoader.setVideo(videoId);
            youTubeThumbnailLoader.setOnThumbnailLoadedListener(new YouTubeThumbnailLoader.OnThumbnailLoadedListener() {
                @Override
                public void onThumbnailLoaded(YouTubeThumbnailView youTubeThumbnailView, String s) {
                    youTubeThumbnailLoader.release();
                }

                @Override
                public void onThumbnailError(YouTubeThumbnailView youTubeThumbnailView, YouTubeThumbnailLoader.ErrorReason errorReason) {

                }
            });
        }

        @Override
        public void onInitializationFailure(YouTubeThumbnailView youTubeThumbnailView, YouTubeInitializationResult youTubeInitializationResult) {

        }
    });

关于android - 如何使用 Youtube API 在 RecyclerView 中加载 Youtube 缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34371461/

相关文章:

youtube - 我可以使用xml从youtube api获取页面 token 吗?

oauth - Youtube OAuth 2.0 用户 token 有效期是多少?

java - 无法在 Android 中集成 ICICI 支付网关

android - 我的 Android 应用程序有一个确实运行但未显示在服务列表中的 Intent 服务

android - 如何在 android studio 中启用 Jack (Java Android Compiler Kit)

youtube - 如何从youtube预览图像中删除黑色边框(图像黑色边框的长度不同)

java - 如何修复 "No adapter attached; skipping layout"

google-api - Youtube V3 API播放 list itemsm未按发布时间排序

javascript - 在Javascript中使用回调函数

android - Java.lang.UnsatisfiedLinkError : No implementation found for int 错误