2017-09-25 2 views
0

Mon thread d'interface utilisateur bloque, alors que je charge une bibliothèque C++ statique. Je veux créer une barre de chargement rotative, afin que l'utilisateur ne pense pas que l'application est gelée. Mais ma barre ne tourne pas en raison de ce chargement de la bibliothèque (cela prend 5 secondes). Est-il possible de charger la bibliothèque dans un bloc statique et de ne pas mettre à jour l'interface utilisateur?Blocage de l'interface utilisateur lors du chargement de la bibliothèque statique C++ dans Android

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

Vous devez charger votre "native-lib" dans un thread non principal. –

Répondre

1

Cela devrait le faire:

static { 
    new Thread(() -> {   
    System.loadLibrary("native-lib"); 
    if (BuildConfig.DEBUG) { 
     OpenCVLoader.initDebug(); 
    } 
    }).start(); 
} 

Mais vous devez prendre soin d'attendre jusqu'à ce que la bibliothèque est chargé et initialisé avant de l'utiliser.

+0

Ceci est une bonne et facile solution. Mais même dans ce cas, l'utilisation d'une bibliothèque native lourde directement à partir d'une activité n'est pas une bonne idée. Il est plus sûr d'envelopper ** native-lib ** dans une classe Java séparée qui n'est pas gérée par le cycle de vie Android. –

+0

Droit - ce n'est pas une solution très "propre". Mais honnêtement, je ne peux pas vraiment voir comment l'utilisation d'une classe séparée améliorerait le comportement d'exécution. Pouvez-vous expliquer cela? – ospf

+0

Une classe séparée peut être chargée de manière plus contrôlée. Pour l'activité, c'est entièrement la responsabilité du système. Vous ne savez pas quand Android va l'instancier. Surtout pour l'exemple fourni par l'OP, ce but de ** LoadingActivity ** est de charger la bibliothèque native. L'énorme surcharge (mémoire, ressources, maintenance) n'est pas justifiée. –