You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将AsyncTask的str变量传入onCreate用于YouTubePlayer加载视频

搞定AsyncTask变量传递到onCreate执行视频加载的问题

嘿,我明白你的需求——要把AsyncTask里第125行的str变量,用来执行youTubePlayer.loadVideo(myStr)操作。不过得先提个关键:AsyncTask是异步执行的,onCreate是Activity初始化的同步方法,你不能直接在onCreate里等着AsyncTask的结果,那样会卡死主线程。

正确的思路是等两个条件都满足:AsyncTask拿到了str,且YouTubePlayer已经初始化完成,再调用加载方法。下面给你最简单有效的修正方案,以及注释好的代码:

核心思路

  1. 用全局变量存AsyncTask返回的str
  2. 监听YouTubePlayer的初始化状态,同时在AsyncTask的onPostExecute里检查播放器是否就绪,哪一方先就绪就等另一方,满足条件就执行加载

仅做必要修正后的代码

public class MainActivity extends YouTubeBaseActivity implements YouTubePlayer.OnInitializedListener {
    public String titleList;
    YouTubePlayerView player;
    private final String API_KEY = "xxxxxxxxxx";
    public String VIDEO_CODE = "xxxxxxxxx";
    // 借助此类我们将拆分数据
    public Elements title; 
    // 新增:存储AsyncTask返回的目标视频ID
    private String mTargetVideoId;
    // 新增:保存初始化好的YouTubePlayer实例
    private YouTubePlayer mYouTubePlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // 绑定你的布局文件
        
        player = findViewById(R.id.youtube_player); // 关联布局中的播放器View
        // 初始化YouTubePlayer,传入本类作为状态监听器
        player.initialize(API_KEY, this);
        
        // 启动你的AsyncTask执行耗时数据操作
        new MyDataFetchTask().execute();
    }

    // YouTubePlayer初始化成功的回调方法
    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
        mYouTubePlayer = youTubePlayer;
        // 如果AsyncTask已经拿到了视频ID,直接加载
        if (mTargetVideoId != null) {
            youTubePlayer.loadVideo(mTargetVideoId);
        }
    }

    // YouTubePlayer初始化失败的回调,可按需添加错误处理逻辑
    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) {
        Toast.makeText(this, "播放器初始化失败,请检查API_KEY或网络", Toast.LENGTH_SHORT).show();
    }

    // 你的AsyncTask类(原代码中处理数据的异步任务)
    private class MyDataFetchTask extends AsyncTask<Void, Void, String> {
        @Override
        protected String doInBackground(Void... params) {
            // 这里是你的耗时逻辑,比如网络请求、数据解析
            // 对应原代码第125行的str变量
            String str = "这里是你获取到的目标视频ID";
            return str;
        }

        @Override
        protected void onPostExecute(String resultStr) {
            super.onPostExecute(resultStr);
            mTargetVideoId = resultStr;
            // 如果播放器已经初始化完成,直接加载视频
            if (mYouTubePlayer != null) {
                mYouTubePlayer.loadVideo(resultStr);
            }
        }
    }
}

关键修正点解释

  • 让Activity实现YouTubePlayer.OnInitializedListener,这样能实时监听播放器是否准备就绪
  • 新增两个全局变量:mTargetVideoId存AsyncTask的结果,mYouTubePlayer存初始化好的播放器实例
  • 不管是播放器先初始化好,还是AsyncTask先拿到结果,只要另一方就绪,就立刻执行loadVideo,完美解决了异步时序问题
  • 完全避免了阻塞主线程的错误写法,符合Android的异步开发规范

内容的提问来源于stack exchange,提问作者Stdio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:07:31