【问题标题】:Inserting multiple videos to a playlist using multithreading results in videos missing使用多线程将多个视频插入播放列表会导致视频丢失
【发布时间】:2018-04-25 06:06:18
【问题描述】:

当我连续插入视频时,所有视频都会插入播放列表,但需要很长时间。当我使用多线程时,最终丢失了一半以上的视频。如何快速插入多个视频而不丢失任何视频?

// Insert videos. 5 videos per asyncTask
List<List<YTVideo>> chunks = Lists.partition(videos, 5);
for (int i = 0; i < chunks.size(); i++) {
    videoAndPlaylistContainer container = new videoAndPlaylistContainer();
    container.playlistId = playlistId;
    List<YTVideo> chunk = chunks.get(i);
    container.videos = chunk;
    InsertPlayListItemTask insertPlaylistItemsTask = new InsertPlayListItemTask();
    runningTasks.add(insertPlaylistItemsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,container));

}

.

 private class InsertPlayListItemTask extends AsyncTask<videoAndPlaylistContainer, Void, Void>{

        @Override
        protected Void doInBackground(videoAndPlaylistContainer... params) {
            videoAndPlaylistContainer container = params[0];
            List<YTVideo> videosChunk = container.videos;
            String playlistId = container.playlistId;
            for (int i = 0; i < videosChunk.size(); i++) {
                YTVideo video = videosChunk.get(i);
                String videoId = video.getId();
                long pos = video.getPosition();
                try {
                    ResourceId resourceId = new ResourceId();
                    resourceId.setKind("youtube#video");
                    resourceId.setVideoId(videoId);

                    PlaylistItemSnippet playlistItemSnippet = new PlaylistItemSnippet();
                    // playlistItemSnippet.setTitle("First video in the test playlist");
                    playlistItemSnippet.setPlaylistId(playlistId);
                    playlistItemSnippet.setResourceId(resourceId);
                    playlistItemSnippet.setPosition(pos);

                    PlaylistItem playlistItem = new PlaylistItem();
                    playlistItem.setSnippet(playlistItemSnippet);


                    YouTube.PlaylistItems.Insert playlistItemsInsertCommand =
                            youtube.playlistItems().insert("snippet", playlistItem);

                    playlistItemsInsertCommand.execute();

                    System.out.println("Inserted video: " + video);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

编辑:video.size() 到 chunks.size()。删除了insertedCount++;

【问题讨论】:

    标签: java android youtube-api youtube-data-api


    【解决方案1】:

    这条线看起来不对...

    for (int i = 0; i < videos.size(); i++) {
    

    i 变量将根据videos 集合的大小而增长,但您只能在此处使用i 变量来访问chunks 集合中的元素...

    List<YTVideo> chunk = chunks.get(i);
    

    我无法想象为什么您没有(最终)收到 ArrayIndexOutOfBounds 异常,除非您(到目前为止)正在使用少于 5 个视频来测试您的代码。

    【讨论】:

    • 你是对的,这是一个错误。我在尝试不同的事情时忘记更改它。即使进行了修复,问题仍然存在
    • 我明白了。您是否在使用 insertedCount 变量? (AFAIK 它只会达到chunks.size()5 的值)。
    • 不,这是我串行插入时留下的。
    • YTVideo 是自定义类吗? (如果有,可以加一下来源吗?)YTVideo.getPosition() 是怎么计算的?如果指定的位置已被占用,会发生什么情况?
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多