解決IJK在子線程執行UI的問題

GitHub地址

ijkplayer 地址

iOS 解決Main Thread Checker: UI API called on a background thread: -[UIApplication applicationState]

Xcode 9以後增加了新特性“主線程檢測器(Main Thread Checker)”,這樣在運行IJK時,就會報IJKSDLGLView裏面,子線程獲取“UIApplication的applicationState”、layer。

有些人的做法是關閉檢測器,但這並沒有從根本上解決問題,就應該將這些操作改成使用主線程進行操作,下面是我的做法,直接修改IJKSDLGLView的源碼。

首先,增加個只在主線程操作的方法,這個方法裏面就是先判斷當前是否在主線程,如果是就直接執行,否則同步切換到主隊列進行執行。

static void IJKHanleInMainThread(dispatch_block_t mainThreadblock) {
    if ([NSThread currentThread] == [NSThread mainThread]){
        mainThreadblock();
    } else {
        dispatch_sync(dispatch_get_main_queue(), ^{
            mainThreadblock();
        });
    }
}

其次將方法- (BOOL)isApplicationActive裏面改成這樣:

__block UIApplicationState appState = 0;
            IJKHanleInMainThread(^{
                appState = [UIApplication sharedApplication].applicationState;
            });

將方法- (void)displayInternal: (SDL_VoutOverlay *) overlay裏面改成這樣

IJKHanleInMainThread(^{
        [[self eaglLayer] setContentsScale:_scaleFactor];
    });
IJKHanleInMainThread(^{
            [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
        });

最後執行IJK的demo,發現子線程操作UI的那些警告就沒有了。這樣重新編譯生成靜態庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章