Blokuje dialog zevnitř JNI kód

hlasů
5

Píšu aplikaci, která je v podstatě wrapper kolem 250 tisíc JNI. JNI (hra motor) má API, jako je handle_penUp (int x, int y). Někdy je třeba dotaz uživatele zevnitř handle_penUp () (pomocí zpětných volání do kódu v jazyce Java), takže dialog I použít k provedení dotazu musí zablokovat.

Chápu, že hlavní podproces provádění nemůže blokovat. Tak jsem plodila druhou nit, která umožňuje všechny hovory JNI, které by mohly mít za následek zpětné volání, které by měly blokovat. Uvnitř tohoto druhého závitu, když potřebuji, aby se dialog blokování, volám startActivityForResult () a poté získat () na semaforu. Když onActivityResult () je volána z hlavního vlákna volání Release () na stejný semafor.

Tato metoda funguje, jestli moje otázka je implementován jako nové aktivity, ale ne, pokud chci ShowDialog () v rámci stávající činnosti. Zprávy protokolu mi říct, moje vlákno potřebuje Looper. Jsem přidáním jednoho - a připojí informace o tom, zda to funguje - ale je to pocit, jako bych šel na špatnou cestu sem. To, co potřebuji, je recept na tom blokování dialogových oken (užitečné, pokud jen proto, že každý druhý platforma je má, a tak portován kód bude často pracují tímto způsobem.)

Položena 16/01/2010 v 15:48
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
2

Zní to velmi blízko k problému jsem měl s nastavením viditelné / neviditelné nějaký pohled z dotykového závitu.

Problém je, že není možné dělat nějaké operace na rozhraní tvoří další vlákno (což je váš případ)

co musíte udělat, je použít popisovač v hlavním vlákně prohlášen jsem ji do aktivity

public static final Handler handlerVisibility = new Handler() {
    public void handleMessage(Message msg) {
        int visibility = msg.getData().getInt("visibility");
        view.setVisibility(visibility);
    }
};

Zvolil jsem možnost public static, takže mohu získat přístup kdekoliv (protože jsem nikdy mít více než jeden hovor v době, a to cítil jsem líný ho předat do dílčích tříd).

Potom, co chcete udělat, je poslat zprávu K tomuto procesu zpracování a jelikož Handler je ve stejném podprocesu jako gui to funguje ^^

Message msg = MainActivity.handlerVisibility.obtainMessage();
    Bundle b = new Bundle();
            b.putInt("visibility", View.VISIBLE);
    msg.setData(b);
            MainActivity.handlerVisibility.sendMessage(msg);

To by mělo vyřešit váš chapače chybu a umožní poslat žádost o GUI z jednoho vlákna do druhého

Doufám, že to pomůže

Jason

Odpovězeno 27/10/2010 v 10:32
zdroj uživatelem

hlasů
0

Ty určitě nechcete dvě UI vlákna. Tam by měl být pouze jeden závit, který komunikuje s Android SDK, pokud jde o tok řízení a zobrazovací cestách (tj cokoliv vztahující se k čerpání, počínaje aktivity, zobrazování dialogových oken, atd).

Také mějte na paměti, že nechcete, aby skutečně udržet nit chodu - vše je na základě událostí, takže chcete, aby váš kód reagovat na něco, něco udělat, a pak ukončit co nejdříve.

Když řeknete „blok“, co přesně máte na mysli? Co je třeba blokován? Pokud si prostě musí přestat reagovat na události, proč nemít boolean, která je nastavena na hodnotu true, zatímco dialog je viditelný, a prostě ignorovat všechny události, i když je pravda?

Odpovězeno 29/06/2010 v 22:53
zdroj uživatelem

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