Jak vyřešit problém NDK knihovny volání pod bodem mrazu UI vlákno

hlasů
4

Mám C knihovna, která I přístup přes NDK. Některé operace jsou časově náročné, takže UI závitové zamrzne na ně. Jak jsem dnes běžnou praxí je použít Runnable takhle:

myFixedThreadPool.execute(new Runnable() 
{
  public void run() 
  {
    NativeClass.callToNDKLibrary();
  };
});

nebo vlákna, jako že:

Thread t = new Thread() 
{
  public void run() 
  {
    NativeClass.callToNDKLibrary();
  }
};
t.start();  

ale problém je, že knihovna C není závit bezpečné: začíná se zhroutí, když jsem zabalit to takhle. Takže otázka je, jak se oddělit od UI niti stále vykonávajícím NDK volání spustit jeden po druhém. Může být nějaký trik s synchronizované pomůže? Také bych chtěl zmínit, že tato knihovna je základní podkladová vrstva pro mé žádosti, a to nejen pomocníkem funkce. Takže je to jen z téměř každé části svého kódu. A jen několik málo funkcí čas konzumovat, většina rychle, aby jim v hlavním vlákně.

Položena 02/11/2010 v 09:48
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
3

Konečný roztok je následující:

  1. Definovat všechny nativní metody JNI jako synchronizované. Tím se zabrání C knihovna z shazovat, ale stále zmrazí UI.
  2. Definovat jediný závit exekutora:

    ExecutorService mExecutorThread = Executors.newSingleThreadExecutor ();

  3. Zabalit vše časově náročné operace v tomto tématu:

    mExecutorThread.execute (nový Runnable () {public void run () {NativeClass.callToNDKLibrary ();}});

Poslední věc, kterou jsem musel udělat, bylo lehce přepracovat svůj kód, aby se ujistil, že nikdo z nativních metod se nazývají z OnDraw (). udělal bych výsledky nativních uložené v obslužné rutiny a použít, aby mezipaměti hodnoty v OnDraw ().

Odpovězeno 16/11/2010 v 23:52
zdroj uživatelem

hlasů
2

ale problém je, že knihovna C není závit bezpečné: začíná se zhroutí, když jsem zabalit to takhle.

Potom použijte jednu speciální pozadí závit pro všechny operace na knihovně. Například použít IntentServicepro přístup do knihovny s činnostmi volající StartService () odeslat příkazy IntentService.

Nebo:

  1. Vytvořit LinkedBlockingQueue<Job>z nějakého Jobtřídy / rozhraní, které definují
  2. Mají jediný závit monitor, který fronty
  3. Odeslat úlohy do této fronty pro přístup do vaší knihovny
  4. Poslat speciální „kill práci“ do fronty způsobí monitor-the-fronta smyčka ukončit, což pozadí vlákno ukončit, jakmile již nepotřebujete fronty a vlákno

Nebo trávit čas, aby se knihovna thread-safe na úrovni C. Tvorba C kód být thread-safe byla předmětem diskuse na ~ 20 let, takže tam je asi nějaké triky, které můžete použít, které vznikly ze vší té zkušenosti.

Odpovězeno 02/11/2010 v 09:57
zdroj uživatelem

hlasů
0

Dalo by se použít Looperk vytvoření smyčka zpráv. Pak projít vaše NDK volá do modulu přes Handlera každý bude probíhat postupně.

Odpovězeno 02/11/2010 v 10:05
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more