2010-01-16 13 views
5

Temel olarak 250K JNI'nin etrafında bir sarıcı olan bir uygulama yazıyorum. JNI (bir oyun motoru), handle_penUp (int x, int y) gibi API'lere sahiptir. Bazen, kullanıcının handle_penUp() içinden (geri aramalar Java koduyla) sorgulanması gerekir, böylece sorguyu uygulamak için kullandığım iletişim kutusu engellenmelidir.İletişim kutusunun JNI kodu içinden engellenmesi

Ana yürütme işleminin engellenemeyeceğini biliyorum. Bu yüzden, engellemeye ihtiyaç duyabilecek geri aramalarla sonuçlanabilecek tüm JNI çağrılarını yapan ikinci bir iş parçacığı ürettim. Bu ikinci iş parçacığı içinde, bir engelleme iletişim kutusunu kapatmam gerektiğinde, startActivityForResult() öğesini çağırıp bir semaforda() ediniyorum. OnActivityResult(), ana iş parçacığına çağrıldığında, aynı semaforda release() işlevini çağırır. Benim sorgu ancak ben mevcut Etkinlik içinden showDialog() isterseniz, yeni Aktivite olarak uygulanması halinde

Bu çalışır. Günlük mesajları, iş parçamın bir Looper'a ihtiyacı olduğunu söylüyor. Bir tane ekliyorum - çalışıp çalışmadığına dair bilgi ekleyeceğim - ama sanki yanlış yoldan aşağı iniyorum sanki. (Diğer her platform'un vardır ve bu yüzden taşınmış kod genellikle bu şekilde çalışacaktır. Çünkü sadece eğer faydalıdır)

cevap

0

Kesinlikle iki UI konuları istemiyorum Benim ihtiyacım engelleme diyaloglar yapmak için bir reçetedir. Android SDK ile kontrol akışının ve ekranın (örn. Çizim, başlangıç ​​aktiviteleri, diyaloglar, vb. Ile ilgili herhangi bir şey) iletişim kurduğu tek bir iş parçacığı olmalıdır. herşey olaylara dayanmaktadır, böylece kod, bir şeye yanıt şey yapmak ve sonra mümkün olduğunca çabuk çıkmak istiyor -

Ayrıca, gerçekte iplik çalışmaya devam etmesi için istemiyoruz unutmayın.

"Blok" derken, tam olarak ne demek istiyorsunuz? Nelerin engellenmesi gerekiyor? Yalnızca olaylara yanıt vermeyi kesmeniz gerekiyorsa, iletişim kutusu görünürken doğru olarak ayarlanmış bir boole sahip değilsiniz ve tüm olayları doğruyken görmezden gelebilirsiniz?

+0

io engellenmeyen muhtemelen vs engelleme olarak bloke (çağrı kadar dönmez

Jason yardımcı olur umarım İstenilen girdiyi aldı veya başarısız oldu, hemen geri dönüyor ve zaten bir tamponda bulunan herhangi bir girdiyi rapor ediyor) –

2

Dokunma parçasından bazı görüntülerin görünmesi/görünmemesi ile yaşadığım bir soruna çok yakın geliyor.

sorun

ne yapmak gerek ana iş parçacığı Kol kullanmaktır (davanız hangisi) Başka bir iş parçacığı oluşturmak GUI bazı işlemleri yapamaz olmasıdır ben bunu ilan Etkinlik

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

Ben hiçbir yere erişebilmesi için kamu statik seçeneği seçti (bir defada daha o bir çağrısı çünkü hiç ve ben alt sınıflara zevk verir tembel hissettim).

sonra ne yapmak istiyorsun bu işleyici mesaj göndermek ve bir Handler sizin Looper hatayı çözmek ve size izin vermelidir o ^^

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

çalışır gui'de aynı iş parçacığı içinde olduğu başka

bir iplikten GUI isteği göndermek o