在我的应用程序中,我使用了图片中person位置的定义。然后,使用RxJava I处理生成的图像并输出结果。在完成这个过程之后。它们都在三星、华为、meizu等设备上工作得很好( android版本5.0及更高版本)。但在小米(无论是什么版本的android)上,我得到了这个错误:
A/libc:错误块0xabc 932a8的无效地址或地址传递给dlfree A/libc:致命信号11 (SIGSEGV),代码2,tid 28493 ( RxNewThreadSche ) A/DEBUG中的故障地址0xdelbaad( pid: 28376,tid: 28493,名称:RxNewThreadSche >>> com.package.name <<< )
有时它在启动后崩溃,有时运行5-6次。但它总是迫使我完成我的申请。我不能把我所有的代码都放在这里,但我认为这是因为:
FaceDetector.release();
因为当我不使用这一行时,我的应用程序就会崩溃,只是不能工作FaceDetector (在其他设备上使用)。
崩溃后,小米产生了这错误。
编辑
private static FaceDetector sFaceDetector;
private static FaceDetectorUtil sFaceDetectorUtil;
private static WeakReference<Context> mContext;
public static void init(Context context) {
if (sFaceDetectorUtil == null) {
sFaceDetectorUtil = new FaceDetectorUtil(context);
}
}
private FaceDetectorUtil(Context context) {
mContext = new WeakReference<>(context);
}
public static FaceDetector getDetector() {
if (sFaceDetector != null) {
sFaceDetector.release();
}
return sFaceDetector = new FaceDetector.Builder(mContext.get())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
}
编辑2
getFaceDetector方法中的当前线程:
P9 lite:
计数: 13
线程: HeapTaskDaemon
线程: FinalizerDaemon
线程: RxComputationThreadPool-2
线程:池1-线程-1
线程: GoogleApiHandler
线程: RxComputationThreadPool-1
线程: JavaCPP分配器
线程: ReferenceQueueDaemon
线程: FinalizerWatchdogDaemon
线程: RxCachedWorkerPoolEvictor-1
线程: RxComputationThreadPool-3
线程: RxNewThreadScheduler-17
线程:池-2-线程-1
小米红米4x
计数: 22
线程:信号捕捉器
线程: RxComputationThreadPool-2
线程: Binder:5858_3
线程: Binder:5858_2
线程: hwuiTask1
线程: RxComputationThreadPool-1
线程: JDWP
线程: FinalizerWatchdogDaemon
线程: RenderThread
线程: RxCachedWorkerPoolEvictor-1
线程: RxComputationThreadPool-3
线程: ReferenceQueueDaemon
线程: Binder:5858_1
线程:池1-线程-1
线程: JavaCPP分配器
线程: HeapTaskDaemon
螺纹:主
线程: GoogleApiHandler
线程: FinalizerDaemon
线程: RxNewThreadScheduler-4
线程: hwuiTask2
线程:池-2-线程-1
如果有人能帮我,我会很感激的。致以问候!
发布于 2017-09-06 14:51:56
错误不是由RxJava引起的。它是由本机代码引起的,可能是由库libmobile_vision_face.so引起的。
如果无法更改本机代码,则可以避免调用FaceDetector.release()
并只初始化一次(例如,在Application
类中),从而解决错误。
UPD:用于单例方法的,我打算使用它如下:
public static FaceDetector getDetector() {
if (sFaceDetector != null) {
return sFaceDetector;
} else {
return sFaceDetector = new FaceDetector.Builder(mContext.get())
.setTrackingEnabled(false)
.setLandmarkType(FaceDetector.ALL_LANDMARKS)
.setMode(FaceDetector.FAST_MODE)
.build();
}
}
此外,您还可以尝试首先将同步添加到您的方法中,以防您试图并行调用它(可能导致错误的原因):
public static synchronized FaceDetector getDetector() {
...
https://stackoverflow.com/questions/46077045
复制相似问题