【Android】主线程切换播放视频时,调用http请求,导致页面卡顿问题

业务场景:当我们在切换视频播放的途中,后台去调用http请求,就导致了主线程被阻塞,页面卡顿的现象,尝试出来的解决方式是开启一个后台线程去加载视频,然后在主线程中更新UI

一、直接上封装方法

    void switchVideo(String videoFile){
    
    
        mVideoView2 = findViewById(R.id.video_view);
        // 在主线程中执行异步任务,加载视频
        new LoadVideoTask().execute(videoFile);
	    }
	    
	    //在后台线程中加载视频资源,然后在主线程中更新UI并播放视频。
		private class LoadVideoTask extends AsyncTask<String, Void, String> {
    
    
        @Override
        protected String doInBackground(String... params) {
    
    
            // 在后台线程中加载视频
            int resId = getResources().getIdentifier(params[0], "raw", getPackageName());
            final String videoPath = "android.resource://" + getPackageName() + "/" + resId;
            return videoPath;
        }
        @Override
        protected void onPostExecute(String videoPath) {
    
    
            // 在主线程中更新UI,设置视频路径并播放
            mVideoView.setVideoURI(Uri.parse(videoPath));
            mVideoView.start();
        }
    }

二、代码解释

这段代码是一个私有内部类 LoadVideoTask ,继承自 AsyncTask ,用于在后台线程中加载视频并在主线程中更新UI并播放视频。具体解释如下:

  • doInBackground(String… params) :这是 AsyncTask 的一个方法,用于在后台线程中执行耗时操作。在这个方法中,它首先通过 getResources().getIdentifier(params[0], “raw”, getPackageName()) 获取指定名称的视频资源ID,然后构建视频的路径,并将路径返回。
  • onPostExecute(String videoPath) :这是 AsyncTask 的另一个方法,在后台操作执行完毕后,在主线程中执行。在这个方法中,它使用 mVideoView2.setVideoURI(Uri.parse(videoPath)) 将视频路径设置给 mVideoView2 ,然后调用 mVideoView2.start() 开始播放视频。

猜你喜欢

转载自blog.csdn.net/qq_48424581/article/details/131833320