Android - Gerçek olana kadar sürekli bir Boole kontrol etmek için ne kullanmalıyım?

Etkin olmak için bir bağlantı gerektiren ve kullanıcıların bir sonraki adıma geçmelerine izin vermeden önce cihazdan toplanmaları gereken belirli bir bilgi parçasını gerektiren bir Android uygulaması geliştiriyorum.

Ben bu emirleri her ikisini de kontrol etmek için bir AsyncTask kullanıyordum. İçlerinden biri 'yanlış' olsaydı, bir Tost görüntülerdi. Daha sonra Thread.s 1 saniye beklenir, tekrar kontrol edilir ve her iki boolean doğru olana veya sayfadan ayrılana kadar tekrar kızartılır.

Dün öğrendiğimiz problem, Thread.sleep'in threadpool'daki tüm Async görevlerini uyması . Bu yüzden aynı zamanda Connection AsyncTask'i uyuyordu ve başarılı bir şekilde bağlanmamızı engelliyordu.

My alternate plan was to switch my current Task to a scheduled Timer, until I read that it "is discouraged in Android" (but the link to the article is broken): Android Asynctask vs Runnable vs timertask vs Service

İki booleğin durumunu kontrol etmek için bir iplik oluşturmanın ilk başta iyi bir fikir olmadığını düşünüyorum, ancak bunun nasıl üstesinden geleceğinden emin değilim. Önerileriniz için teşekkür ederiz!

EDIT: I have reworded the question to be more clear.

1
"Muhtemelen kontrol ettiğim 2 boole olduğu için BluetoothReceiver'ı dinleyemeyeceğimi söylemeliyim." Bu neden kullanamadığını açıklamıyor. Bu booleanslara örneğin SharedPreferences üzerinde devam edilebilir, böylece yayını alırken durumlarını alabilirsiniz.
katma yazar Anyonymous2324, kaynak
Cevabımı güncelledim.
katma yazar Anyonymous2324, kaynak
Cevabımı güncelledim.
katma yazar Anyonymous2324, kaynak
Cevabımı güncelledim.
katma yazar Anyonymous2324, kaynak
Diğer değişkeniniz için, muhtemelen ne yapmaya çalıştığınızı ve bunu kabul ettiğinizi açıklayan başka bir soru daha göndermelisiniz.
katma yazar Anyonymous2324, kaynak
Diğer değişkeniniz için, muhtemelen ne yapmaya çalıştığınızı ve bunu kabul ettiğinizi açıklayan başka bir soru daha göndermelisiniz.
katma yazar Anyonymous2324, kaynak
Diğer değişkeniniz için, muhtemelen ne yapmaya çalıştığınızı ve bunu kabul ettiğinizi açıklayan başka bir soru daha göndermelisiniz.
katma yazar Anyonymous2324, kaynak
Ve dolayısıyla bağlı cihazlarla ilgili cevabım. : P
katma yazar Anyonymous2324, kaynak
Ve dolayısıyla bağlı cihazlarla ilgili cevabım. : P
katma yazar Anyonymous2324, kaynak
Ve dolayısıyla bağlı cihazlarla ilgili cevabım. : P
katma yazar Anyonymous2324, kaynak
Ve dolayısıyla bağlı cihazlarla ilgili cevabım. : P
katma yazar Anyonymous2324, kaynak
Yapmaya çalıştığınız şey ne olursa olsun, bağlı cihazları düzenli aralıklarla kontrol etmek kötüdür. Bluetooth cihazının ne zaman tekrar bağlanacağından emin olamazsınız. Ya asla değilse? Uygulamanız sebepsiz yere kaynak israfı olacak. Uygulamanızı bağlı cihazların durumu hakkında güncel tutmak için yayını kullanın ve cihazların şimdiki durumunu okurken periyodik olarak diğer boolean kontrollerini kullanın.
katma yazar Anyonymous2324, kaynak
Yapmaya çalıştığınız şey ne olursa olsun, bağlı cihazları düzenli aralıklarla kontrol etmek kötüdür. Bluetooth cihazının ne zaman tekrar bağlanacağından emin olamazsınız. Ya asla değilse? Uygulamanız sebepsiz yere kaynak israfı olacak. Uygulamanızı bağlı cihazların durumu hakkında güncel tutmak için yayını kullanın ve cihazların şimdiki durumunu okurken periyodik olarak diğer boolean kontrollerini kullanın.
katma yazar Anyonymous2324, kaynak
Yapmaya çalıştığınız şey ne olursa olsun, bağlı cihazları düzenli aralıklarla kontrol etmek kötüdür. Bluetooth cihazının ne zaman tekrar bağlanacağından emin olamazsınız. Ya asla değilse? Uygulamanız sebepsiz yere kaynak israfı olacak. Uygulamanızı bağlı cihazların durumu hakkında güncel tutmak için yayını kullanın ve cihazların şimdiki durumunu okurken periyodik olarak diğer boolean kontrollerini kullanın.
katma yazar Anyonymous2324, kaynak
Yapmaya çalıştığınız şey ne olursa olsun, bağlı cihazları düzenli aralıklarla kontrol etmek kötüdür. Bluetooth cihazının ne zaman tekrar bağlanacağından emin olamazsınız. Ya asla değilse? Uygulamanız sebepsiz yere kaynak israfı olacak. Uygulamanızı bağlı cihazların durumu hakkında güncel tutmak için yayını kullanın ve cihazların şimdiki durumunu okurken periyodik olarak diğer boolean kontrollerini kullanın.
katma yazar Anyonymous2324, kaynak
"Muhtemelen kontrol ettiğim 2 boole olduğu için BluetoothReceiver'ı dinleyemeyeceğimi söylemeliyim." Bu neden kullanamadığını açıklamıyor. Bu booleanslara örneğin SharedPreferences üzerinde devam edilebilir, böylece yayını alırken durumlarını alabilirsiniz.
katma yazar Anyonymous2324, kaynak
"Muhtemelen kontrol ettiğim 2 boole olduğu için BluetoothReceiver'ı dinleyemeyeceğimi söylemeliyim." Bu neden kullanamadığını açıklamıyor. Bu booleanslara örneğin SharedPreferences üzerinde devam edilebilir, böylece yayını alırken durumlarını alabilirsiniz.
katma yazar Anyonymous2324, kaynak
"Muhtemelen kontrol ettiğim 2 boole olduğu için BluetoothReceiver'ı dinleyemeyeceğimi söylemeliyim." Bu neden kullanamadığını açıklamıyor. Bu booleanslara örneğin SharedPreferences üzerinde devam edilebilir, böylece yayını alırken durumlarını alabilirsiniz.
katma yazar Anyonymous2324, kaynak
Doğru, bu, kullanamadığımdan yapamayacağım anlamına gelmiyor. Ancak, gereksiz olacaktır. İkinci booleni 'doğru' olana kadar periyodik olarak kontrol etmek için hala bir çözüme ihtiyacım var.
katma yazar beyondtheteal, kaynak
Doğru, bu, kullanamadığımdan yapamayacağım anlamına gelmiyor. Ancak, gereksiz olacaktır. İkinci booleni 'doğru' olana kadar periyodik olarak kontrol etmek için hala bir çözüme ihtiyacım var.
katma yazar beyondtheteal, kaynak
Kabul. Orijinal son paragrafımda belirttiğim gibi, değişmek üzere bir değişkeni dinlemek için bir iş parçacığı oluşturmak 'iyi bir fikir değil'. Bir dinleyiciyi veya başka bir şeyi kaydetmeyi tercih ederdim, ama nasıl yapılacağından emin değilim.
katma yazar beyondtheteal, kaynak
Daha net olması için soruyu yeniden değerlendirdim.
katma yazar beyondtheteal, kaynak
Daha net olması için soruyu yeniden değerlendirdim.
katma yazar beyondtheteal, kaynak
Doğru, bu, kullanamadığımdan yapamayacağım anlamına gelmiyor. Ancak, gereksiz olacaktır. İkinci booleni 'doğru' olana kadar periyodik olarak kontrol etmek için hala bir çözüme ihtiyacım var.
katma yazar beyondtheteal, kaynak
Doğru, bu, kullanamadığımdan yapamayacağım anlamına gelmiyor. Ancak, gereksiz olacaktır. İkinci booleni 'doğru' olana kadar periyodik olarak kontrol etmek için hala bir çözüme ihtiyacım var.
katma yazar beyondtheteal, kaynak
Kabul. Orijinal son paragrafımda belirttiğim gibi, değişmek üzere bir değişkeni dinlemek için bir iş parçacığı oluşturmak 'iyi bir fikir değil'. Bir dinleyiciyi veya başka bir şeyi kaydetmeyi tercih ederdim, ama nasıl yapılacağından emin değilim.
katma yazar beyondtheteal, kaynak
Kabul. Orijinal son paragrafımda belirttiğim gibi, değişmek üzere bir değişkeni dinlemek için bir iş parçacığı oluşturmak 'iyi bir fikir değil'. Bir dinleyiciyi veya başka bir şeyi kaydetmeyi tercih ederdim, ama nasıl yapılacağından emin değilim.
katma yazar beyondtheteal, kaynak
Kabul. Orijinal son paragrafımda belirttiğim gibi, değişmek üzere bir değişkeni dinlemek için bir iş parçacığı oluşturmak 'iyi bir fikir değil'. Bir dinleyiciyi veya başka bir şeyi kaydetmeyi tercih ederdim, ama nasıl yapılacağından emin değilim.
katma yazar beyondtheteal, kaynak

6 cevap

dinlemek için daha iyi Bluetooth Bağlantı durumu Değişiklik Niyeti değiştirdi ve bağlantı BAĞLANTI 'dan BAĞLANTI ' ya giderse, Amacıyla bileceksiniz ( yayın alıcısı ). Her saniyede bir durumu kontrol etmeniz gerekmez.

Etkinliklere nasıl kayıt olabileceğinizi anlamak için aşağıdaki cevaba bakınız.

Bağlantı Durumları İçin Niyet Nasıl Kaydedilir?

Also see Android Documentation

0
katma
Öneriniz için teşekkürler! Bununla birlikte, bu özel kullanım durumu için, bu yaklaşımı kullanamıyorum. Lütfen sorumla ilgili düzenlemeye bakın.
katma yazar beyondtheteal, kaynak

dinlemek için daha iyi Bluetooth Bağlantı durumu Değişiklik Niyeti değiştirdi ve bağlantı BAĞLANTI 'dan BAĞLANTI ' ya giderse, Amacıyla bileceksiniz ( yayın alıcısı ). Her saniyede bir durumu kontrol etmeniz gerekmez.

Etkinliklere nasıl kayıt olabileceğinizi anlamak için aşağıdaki cevaba bakınız.

Bağlantı Durumları İçin Niyet Nasıl Kaydedilir?

Also see Android Documentation

0
katma
Öneriniz için teşekkürler! Bununla birlikte, bu özel kullanım durumu için, bu yaklaşımı kullanamıyorum. Lütfen sorumla ilgili düzenlemeye bakın.
katma yazar beyondtheteal, kaynak

Bluetooth cihazlarınızla ilgili orijinal sorunuzla ilgili olarak, bir BroadcastReceiver kullanmalı ve BluetoothDevice.ACTION_ACL_CONNECTED , BluetoothDevice.ACTION_ACL_DISCONNECTED ve BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED .

Bu şekilde, uygulamanızı bağlı cihazların durumu hakkında güncel tutarsınız.

Şimdi son düzenlemeniz için, bunun için bir İşleyici ve bir Çalıştırılabilir kullanmalısınız. Her ikisini de Etkinliğinizin üyesi olarak ilan edin ve faaliyetinizin onResume() öğesinde olduğu gibi Çalıştırılabilir 'ı başlatın:

myHandler.postDelayed(myRunnable, 1000);

Çalıştırılabilir öğeniz şöyle görünmelidir:

private Runnable myRunnable = new Runnable() {

    @Override
    public void run() {
        //Check your logic here

        if (logic not present) {
            myHandler.postDelayed(myRunnable, 1000);
        }
    }
};

Çalıştırılabilir içinde değişkenlerinizin istediklerinizle eşleşip eşleşmediğini kontrol edersiniz. Olmazsa, Çalıştırılabilir 'ı tekrar çalıştırmak için İşleyicinizi kullanın. Son bir şey, Etkinlik onPause() üzerinde Çalıştırılabilir öğesinin çalışmasını durdurmalısınız:

myHandler.removeCallbacks(myRunnable);

Umarım yardımcı olur.

0
katma
@ argablarga Cevabımı güncelledim.
katma yazar Anyonymous2324, kaynak

Bluetooth cihazlarınızla ilgili orijinal sorunuzla ilgili olarak, bir BroadcastReceiver kullanmalı ve BluetoothDevice.ACTION_ACL_CONNECTED , BluetoothDevice.ACTION_ACL_DISCONNECTED ve BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED .

Bu şekilde, uygulamanızı bağlı cihazların durumu hakkında güncel tutarsınız.

Şimdi son düzenlemeniz için, bunun için bir İşleyici ve bir Çalıştırılabilir kullanmalısınız. Her ikisini de Etkinliğinizin üyesi olarak ilan edin ve faaliyetinizin onResume() öğesinde olduğu gibi Çalıştırılabilir 'ı başlatın:

myHandler.postDelayed(myRunnable, 1000);

Çalıştırılabilir öğeniz şöyle görünmelidir:

private Runnable myRunnable = new Runnable() {

    @Override
    public void run() {
        //Check your logic here

        if (logic not present) {
            myHandler.postDelayed(myRunnable, 1000);
        }
    }
};

Çalıştırılabilir içinde değişkenlerinizin istediklerinizle eşleşip eşleşmediğini kontrol edersiniz. Olmazsa, Çalıştırılabilir 'ı tekrar çalıştırmak için İşleyicinizi kullanın. Son bir şey, Etkinlik onPause() üzerinde Çalıştırılabilir öğesinin çalışmasını durdurmalısınız:

myHandler.removeCallbacks(myRunnable);

Umarım yardımcı olur.

0
katma
@ argablarga Cevabımı güncelledim.
katma yazar Anyonymous2324, kaynak

Diğer iki adam, muhtemelen kullanmanız gereken temiz bir çözüm sunar. Ancak kodunuzu yeniden yazmak istemiyorsanız, hızlı ve kirli bir düzeltme olduğunu düşünüyorum.

The problem is the default behaviour of AsyncTask; They run sequentally. So when your thread sleeps, the other tasks are just waiting in line for it to finish. To change this behaviour you can do your AsyncTask with .executeOnExecutor(); rather than .execute();

Bu, diğer AsyncTasks'in parazitsiz çalışmasını ve aynı anda birden fazla iş parçacığı oluşturmasını sağlar.

0
katma
Lanet olsun. Bu durumda, diğer iki çözüm geçerlidir. :)
katma yazar Treeline, kaynak
Yine de teşekkürler! Neden ile ilgili herhangi bir belge bulursanız, Thread.sleep ikisini de etkiler, bu harika olur. Hiçbir şey bulamadım.
katma yazar beyondtheteal, kaynak
Muhtemelen onları zaten bu şekilde çalıştırdığımı paylaşmalıydım: task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); Ancak, Thread.sleep hala ikisini de etkiliyor gibi görünüyor.
katma yazar beyondtheteal, kaynak

Diğer iki adam, muhtemelen kullanmanız gereken temiz bir çözüm sunar. Ancak kodunuzu yeniden yazmak istemiyorsanız, hızlı ve kirli bir düzeltme olduğunu düşünüyorum.

The problem is the default behaviour of AsyncTask; They run sequentally. So when your thread sleeps, the other tasks are just waiting in line for it to finish. To change this behaviour you can do your AsyncTask with .executeOnExecutor(); rather than .execute();

Bu, diğer AsyncTasks'in parazitsiz çalışmasını ve aynı anda birden fazla iş parçacığı oluşturmasını sağlar.

0
katma
Lanet olsun. Bu durumda, diğer iki çözüm geçerlidir. :)
katma yazar Treeline, kaynak
Yine de teşekkürler! Neden ile ilgili herhangi bir belge bulursanız, Thread.sleep ikisini de etkiler, bu harika olur. Hiçbir şey bulamadım.
katma yazar beyondtheteal, kaynak
Muhtemelen onları zaten bu şekilde çalıştırdığımı paylaşmalıydım: task.executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); Ancak, Thread.sleep hala ikisini de etkiliyor gibi görünüyor.
katma yazar beyondtheteal, kaynak