在Android中加载静态C++库时阻塞UI

问题描述:

当我加载静态C++库时,我的UI线程被阻塞。 我想创建一个旋转加载栏,所以用户不会认为App被冻结。但是由于这个库加载,我的酒吧不旋转(需要5秒钟)。是否有可能加载库在静态块,而不是更新用户界面?在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”加载到非主线程中。 –

这应做到:

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

但是你要关心等到库被加载并使用它之前初始化。

+0

这是一个很好很容易修复的问题。但即使如此,直接从一个Activity使用一个沉重的本地库也不是一个好主意。将** native-lib **包装到不受Android生命周期管理的独立Java类中更安全。 –

+0

对 - 这不是一个非常“干净”的解决方案。但说实话,我真的不明白如何使用单独的类会改善运行时行为。你能解释一下吗? – ospf

+0

可以以更受控制的方式加载单独的类。对于活动,这完全是系统的责任。你不知道什么时候Android会实例化它。特别是对于OP提供的示例,** ** ** ** ** **的唯一目的是加载本地库。巨大的开销(内存,资源,维护)是不合理的。 –