Java 在Android中加载静态C++库时阻塞UI
我的UI线程被阻塞,而我正在加载静态C++库。 我想创建一个旋转加载条,这样用户就不会认为应用程序被冻结了。但我的酒吧没有旋转,因为这个图书馆加载它需要大约5秒钟。是否可以在静态块中加载库而不更新UIJava 在Android中加载静态C++库时阻塞UI,java,android,multithreading,android-ndk,Java,Android,Multithreading,Android Ndk,我的UI线程被阻塞,而我正在加载静态C++库。 我想创建一个旋转加载条,这样用户就不会认为应用程序被冻结了。但我的酒吧没有旋转,因为这个图书馆加载它需要大约5秒钟。是否可以在静态块中加载库而不更新UI public class LoadingActivity extends AppCompatActivity { /** * Load native libraries */ static { System.loadLibrary("nat
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();
}
但是,在使用库之前,您必须注意等待库被加载和初始化。您应该在非主线程中加载本机库。这是一个很好且简单的修复方法。但即便如此,直接从活动中使用大量本机库也不是一个好主意。将本机库封装在一个单独的Java类中更安全,该类不是由Android lifecycle管理的。但老实说,我真的看不出使用单独的类如何改善运行时行为。你能解释一下吗?一个单独的类可以以更可控的方式加载。对于活动,这完全是系统的责任。你不知道Android什么时候会实例化它。特别是对于OP提供的示例,此LoadingActivity的唯一目的是加载本机库。巨大的内存、资源和维护开销是不合理的。在Android框架派生类应用程序、活动、片段等中避免使用本机方法的另一个好理由是允许使用Robolectric see等工具进行自动化测试。