如何将AsyncTask的str变量传入onCreate用于YouTubePlayer加载视频
搞定AsyncTask变量传递到onCreate执行视频加载的问题
嘿,我明白你的需求——要把AsyncTask里第125行的str变量,用来执行youTubePlayer.loadVideo(myStr)操作。不过得先提个关键:AsyncTask是异步执行的,onCreate是Activity初始化的同步方法,你不能直接在onCreate里等着AsyncTask的结果,那样会卡死主线程。
正确的思路是等两个条件都满足:AsyncTask拿到了str,且YouTubePlayer已经初始化完成,再调用加载方法。下面给你最简单有效的修正方案,以及注释好的代码:
核心思路
- 用全局变量存AsyncTask返回的str
- 监听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
相关产品推荐
相关产品推荐

