2017-09-25 4 views
0

static C++ 라이브러리를로드하는 동안 UI가 스레드를 차단하고 있습니다. 회전로드 바를 만들고 싶습니다. 따라서 사용자는 앱이 정지되었다고 생각하지 않습니다. 하지만이 라이브러리 로딩으로 인해 내 바가 회전하지 않습니다 (5 초 정도 걸립니다). 정적 블록에서 라이브러리를로드하고 UI를 업데이트 할 수 있습니까?Android에서 정적 C++ 라이브러리를로드하는 동안 UI를 차단하는 중

public class LoadingActivity extends AppCompatActivity { 


    /** 
    * Load native libraries 
    */ 

    static { 
     System.loadLibrary("native-lib"); 
     if (BuildConfig.DEBUG) { 
      OpenCVLoader.initDebug(); 
     } 
    } 

    @Override 
    protected void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Intent returnIntent = new Intent(); 
     returnIntent.putExtra("result", Activity.RESULT_OK); 
     setResult(Activity.RESULT_OK, returnIntent); 
     finish(); 
    } 
} 
+0

"native-lib"를 기본이 아닌 스레드로로드해야합니다. –

답변

1

이 그것을 수행해야합니다

static { 
    new Thread(() -> {   
    System.loadLibrary("native-lib"); 
    if (BuildConfig.DEBUG) { 
     OpenCVLoader.initDebug(); 
    } 
    }).start(); 
} 

하지만 당신은 라이브러리가로드를 사용하기 전에 초기화 될 때까지 기다리고 걱정해야합니다.

+0

이것은 쉽고 간단합니다. 하지만 그때조차도 Activity에서 무거운 네이티브 라이브러리를 직접 사용하는 것은 좋은 생각이 아닙니다. ** native-lib **를 Android 라이프 사이클에서 관리하지 않는 별도의 Java 클래스로 래핑하는 것이 더 안전합니다. –

+0

오른쪽 - 아주 깨끗한 해결책은 아닙니다. 솔직히 별개의 클래스를 사용하면 런타임 동작이 어떻게 향상되는지 실제로 알 수 없습니다. 설명해 주시겠습니까? – ospf

+0

별도의 클래스를보다 제어 된 방식으로로드 할 수 있습니다. 활동을 위해서, 그것은 전적으로 시스템의 책임입니다. Android에서 언제 인스턴스화할지 모릅니다. 특히 OP에서 제공하는 예제의 경우 ** LoadingActivity **의 유일한 목적은 기본 라이브러리를로드하는 것입니다. 엄청난 오버 헤드 (메모리, 자원, 유지 보수)는 정당화되지 않습니다. –