放在下一个runloop执行,保证当前执行正确

遇到的问题是:播放下一个视频的时候,一直loading,研究了一下,使用下一个runloop解决
这里说一下视频播放的流程:
1. 获取视频地址URL
2. 根据URL获取视频缓冲
3. 当缓冲ok的时候,判断播放器state状态,当state == active的时候可以播放,stat = stop的时候不能播放。
下面从视频播放完成playToEnd开始说起:

/*视频播放完,开始下个视频播放*/
-(void)playToEnd {
    state = active;/*播放器state需要是active的,如果是stop的情况就不播放下一个视频了。这里预设state是active*/
    playNextVideo(state); 
    state = stop;/*由于playNextVideo用到了state,该行不能放到method之上*/
}

/*播放下一个视频*/
-(void) playNextVideo:(state ){
    /*异步联网操作,获取视频url地址.前提是state = active*/
    if(state == active){
        [NetWrok connectNetwork:^{
            startLoad();
        }];
    }
}

/*异步联网操作,根据地址获取一定缓冲*/
-(void) startLoad{
    state = active;
    startBuffer();
}

/*缓冲完成,开始播放画面*/
-(void) onBufferOK{
    if(state = active){
        play();
    }
}

正常逻辑:
看调用playNextVideo(state)这一行(第4行),由于这个函数获取视频url地址是异步的,程序会先执行state=stop。然后网络应答后再调用startLoad,此时state=active;今儿onBufferOK函数,也能调用play函数了;
出问题逻辑:
[NetWrok connectNetwork^{}}在由缓冲的情况下,不发起实际的网络请求。立即应答,导致startLoad立即被调用。然而第5行执行state=stop了。最后即便onBufferOK调用,但是state还是stop状态,并么有调用play函数。程序state 死锁了。
    
解决办法就是:
 在调用startLoad的那行加放到下一个runloop执行。保证playToEnd函数的第5行 state=stop先执行。代码如下:

/*播放下一个视频*/
-(void) playNextVideo:(state ){
    /*异步联网操作,获取视频url地址.前提是state = active*/
    if(state == active){
        [NetWrok connectNetwork:^{
            /*放到下一个runloop执行*/
            dispatch_async(dispatch_get_main_queue(),^{
                startLoad();
            });
        }];
    }
}

中的执行顺序是怎样的? 回答: 在Android中,一个runloop中的Activity生命周期的执行顺序是按照以下步骤进行的:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。\[3\]在正常情况下,一个Activity会经历这七个生命周期。首先,在Activity第一次被运行时会调用onCreate方法,用于进行一些初始化工作。然后,当Activity被重新启动时会调用onRestart方法。接下来,Activity正在被启动时会调用onStart方法,表示Activity正在从不可见到可见状态的转变。然后,当Activity变为可见状态并出现在前台工作时,会调用onResume方法。当Activity正在暂停但依然可见时,会调用onPause方法。当Activity即将暂停并工作在后台时,会调用onStop方法。最后,当Activity即将被销毁时,会调用onDestroy方法。\[3\]这是一个正常情况下的生命周期顺序。在异常情况下,比如系统配置发生改变导致Activity被杀死并重新创建,会先调用onPause方法,然后调用onSaveInstanceState方法保存数据,接着重新创建Activity并调用onRestoreInstanceState方法恢复之前的数据。\[1\]总的来说,Android的Activity生命周期的执行顺序是按照一定的规律进行的,确保了Activity的正常运行和用户体验。 #### 引用[.reference_title] - *1* *3* [Android——Activity的生命周期](https://blog.csdn.net/News53231323/article/details/113917191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Android生命周期详解](https://blog.csdn.net/qq_43094133/article/details/107686933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值