2017-09-06 5 views
1

Dans mon application, j'utilise la définition de la position de la personne dans l'image. Après cela, en utilisant RxJava, je traite l'image résultante et affiche le résultat. Après avoir ré-exécuté ce processus. Tout fonctionne parfaitement sur des appareils tels que Samsung, Huawei, Meizu et autres (avec Android version 5.0 et plus). Mais sur Xiaomi (peu importe quelle version d'Android) J'obtiens cette erreur:Fatal signal 11 (SIGSEGV) lors de l'utilisation RxJava et play services vision

A/libc: invalid address or address of corrupt block 0xabc932a8 passed to dlfree A/libc: Fatal signal 11 (SIGSEGV), code 2, fault addr 0xdeadbaad in tid 28493 (RxNewThreadSche) A/DEBUG: pid: 28376, tid: 28493, name: RxNewThreadSche >>> com.package.name <<<

Parfois, il se bloque après démarrage procces, parfois travailler 5-6 fois. Mais ça force toujours à finir ma demande. Je ne peux pas mettre ici tout mon code, mais je pense que cela est dû à:

FaceDetector.release(); 

parce que quand je ne l'utilise pas cette ligne mon application écrasé sinon, tout simplement pas travailler FaceDetector (sur d'autres appareils i utilisé il). Après une panne, xiaomi a généré une erreur this.

EDIT

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(); 
} 

EDIT 2

fils courantes méthode getFaceDetector:

Huawei P9 Lite:
Count: 13
Sujets: HeapTaskDaemon
Sujets: FinalizerDaemon
Sujets: RxComputationThreadPool-2
Sujets: pool-1-fil-1
Sujets: GoogleApiHandler
Sujets: RxComputationThreadPool-1
Sujets: JavaCPP Deallocator
Sujets: ReferenceQueueDaemon
Sujets: FinalizerWatchdogDaemon
Sujets: RxCachedWorkerPoolEvictor-1
Sujets: RxComputationThreadPool-3
Sujets: RxNewThreadScheduler-17
discussion s: pool-2-fil-1

Xiaomi redmi 4x:
Count: 22
Sujets: Attrape signal
Sujets: RxComputationThreadPool-2
Sujets: Liant: 5858_3
Sujets: Liant : 5858_2
Sujets: hwuiTask1
Sujets: RxComputationThreadPool-1
Sujets: JDWP
Sujets: FinalizerWatchdogDaemon
Sujets: RenderThread
Sujets: RxCachedWorkerPoolEvictor-1
Sujets: RxComputationThreadPool-3
Sujets: ReferenceQueueDaemon
Sujets: Liant: 5858_1
Sujets: pool-1-fil-1
Sujets: JavaCPP Deallocator
Fils : HeapTaskDaemon
Sujets: principales
Sujets: GoogleApiHandler
Sujets: FinalizerDaemon
Sujets: RxNewThreadScheduler-4
Discussions: hwuiTask2
Discussions: pool-2-thread-1

J'apprécierais vraiment que quelqu'un puisse m'aider. Cordialement!

+0

Quand appelez-vous 'FaceDetector.release()'? Y a-t-il d'autres threads qui l'utilisent encore? – cwbowron

+0

@cwbowron Nope, juste un qui pocces image – Anonymous

Répondre

1

L'erreur n'est pas provoquée par RxJava. Il est provoqué par du code natif, probablement par la bibliothèque libmobile_vision_face.so.

Si vous ne pouvez pas modifier le code natif, vous pouvez contourner l'erreur en évitant d'appeler FaceDetector.release() et en l'initialisant une seule fois (dans votre classe Application par exemple).

UPD: pour l'approche singleton j'avais à l'esprit de l'utiliser comme suit:

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(); 
    } 
} 

vous pouvez juste essayer également d'ajouter la synchronisation à votre méthode d'abord, dans le cas si vous essayez d'appeler en parallèle (ce qui pourrait conduire à l'erreur):

public static synchronized FaceDetector getDetector() { 
    ... 
+0

Merci pour la réponse. Pour l'initialisation FaceDetector j'utilise la classe singletone (mis à jour ma question) est ce que tu veux dire? – Anonymous

+0

Oui, cela devrait fonctionner aussi bien –

+0

Mais pas sur xiaomi ( – Anonymous