我有一个通过 NDK 访问的 C 库。某些操作非常耗时,因此 UI 线程在执行这些操作时会卡住。正如我现在的常见做法是那样使用 Runnable:
myFixedThreadPool.execute(new Runnable()
{
public void run()
{
NativeClass.callToNDKLibrary();
};
});
或类似的主题:
Thread t = new Thread()
{
public void run()
{
NativeClass.callToNDKLibrary();
}
};
t.start();
但问题是 C 库不是线程安全的:当我这样包装它时它开始崩溃。所以问题是如何从仍然强制 NDK 调用一次运行一个的 UI 线程分离。同步的一些技巧可能会有所帮助吗?我还想提一下,这个库是我的应用程序的核心底层,而不仅仅是一个辅助函数。所以我的代码的几乎每个部分都会调用它。并且只有少数函数会消耗时间,大多数会很快将它们保留在主线程中。
最佳答案
最终的解决方案如下:
- 将所有 JNI native 方法定义为同步的。这将防止 C 库崩溃,但仍会卡住 UI。
定义单线程执行器:
ExecutorService mExecutorThread = Executors.newSingleThreadExecutor();
在该线程中包装所有耗时的操作:
mExecutorThread.execute(new Runnable() { 公共(public)无效运行() { NativeClass.callToNDKLibrary(); } });
我必须做的最后一件事是稍微重新设计我的代码,以确保不会从 onDraw() 调用任何 native 方法。我将本地方法的结果缓存在事件处理程序中,并在 onDraw() 中使用缓存的值。
关于android - 如何解决NDK库调用卡住UI线程的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4076101/