在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();
}
}
这应做到:
static {
new Thread(() -> {
System.loadLibrary("native-lib");
if (BuildConfig.DEBUG) {
OpenCVLoader.initDebug();
}
}).start();
}
但是你要关心等到库被加载并使用它之前初始化。
这是一个很好很容易修复的问题。但即使如此,直接从一个Activity使用一个沉重的本地库也不是一个好主意。将** native-lib **包装到不受Android生命周期管理的独立Java类中更安全。 –
对 - 这不是一个非常“干净”的解决方案。但说实话,我真的不明白如何使用单独的类会改善运行时行为。你能解释一下吗? – ospf
可以以更受控制的方式加载单独的类。对于活动,这完全是系统的责任。你不知道什么时候Android会实例化它。特别是对于OP提供的示例,** ** ** ** ** **的唯一目的是加载本地库。巨大的开销(内存,资源,维护)是不合理的。 –
您应该将您的“native-lib”加载到非主线程中。 –