2011-05-07 23 views
11
Ben Etkinliğinizde DEĞİL olduğum sürece varsayılan bluetooth adaptörü almaya çalışırken, ancak TimerTask içinde ( Service içinde oluşturulan) ediyorum

kullanarak iken RuntimeException atma BluetoothAdapter.getDefaultAdapter():değil Faaliyete

BluetoothAdapter.getDefaultAdapter(); 

- yani Etkinliğinizden bu adaptör almak için herhangi bir olasılık var

Exception while invoking java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

başvurum herhangi bir faaliyeti yoktur: aşağıdaki özel durum alıyorum?

+0

Bu hatanın Android yanıtına bakın: https://code.google.com/p/android/issues/detail?id=16587 – Jojo44

cevap

13

Bu Android'de bir hata gibi görünüyor ve hala Android 4.0 (Ice Cream Sandwich)

bu geçici çözüm ve bir çalışan iş parçacığı BluetoothAdapter.getDefaultAdapter() arama yapabilmek için var (örn AsyncTask), yapmanız gereken tek şey (geçerli aktivitenin onCreate() iç örn) ana UI iş parçacığı üzerinde bir kez çağrı BluetoothAdapter.getDefaultAdapter() olduğunu.

RuntimeException yalnızca başlatma sırasında atılır ve BluetoothAdapter.getDefaultAdapter() yalnızca ilk kez aradığınızda başlatır. buna Sonraki aramalar bile arka plan Konuda yerini alacak.

+0

Bir hata sayfasında herhangi bir link var mı? –

0

Merhaba Kocus hiçbir BluetoothAdapter calss yılında getDefault() denilen herhangi bir yöntem yoktur. O olmalıdır BluetoothAdapter.getDefaultAdapter();

follow this link for more information.

+1

Örneğiniz, 'BluetoothAdapter'ı' Aktivite''den almak içindir. İstediğim bu değil. – Kocus

+0

düzenlenmiştir. Bunu hafızadan yazdım. – Kocus

+0

evet ama bence BluetoothAdapter.getDefaultAdapter() çalışan iş parçacığı üzerinden çağrılabilir. UI iş parçacığı olmalıdır. – Sujit

6

UI iplik çalışmalarında BluetoothAdapter.getDefaultAdapter() çağrılması, ama çok pratik değildir. Sahte Aktivite ile geçici çözümü denedi ama böyle geçici çözümler nefret beri, ben hata mesajı gerçekten diyor ve iplik Looper.prepare() aramamış olmasını başka bir şey ne OKUYUN karar verdi.

numaralı telefonu aramadan önce Looper.prepare() numaralı telefonu arayarak sorunu yalnızca bir UI iş parçacığında değil, her yerde çözmeniz gerekir. Bugüne kadar benim için

İşleri cezası.

+0

İşçi iş parçacığını bir Looper olmasını istemediğiniz sürece bu kötü bir fikir gibi görünüyor. –

+1

Geçerli iş parçacığının zaten Looper.prepare() 'yi böyle aradığını kontrol etmelisiniz:' if (Looper.myLooper() == null) { Looper.prepare(); } 'Aksi takdirde, bu işlev yalnızca iş parçacığı başına bir kez çağrılabileceğinden bir" RuntimeException "alırsınız. –

1

2.3.x bulunan bir Yakaladım sakının, ancak 4.x sabit olmuştur: Eğer ana uygulama iş dışında herhangi bir iş parçacığı üzerinde BluetoothAdapter.getDefaultAdapter() çağırırsanız, o iplik de Looper.prepare() ve sonradan Looper.loop() çağırmalıdır.

yüzden karşılaştım, en azından bir soruna neden olur yapamadığımız: accept() bağlanmaya çalışmadan ilk kez başarılı ama sonra bile ServerSocket üzerinde close() kullandıktan sonra, art arda denemeler başarılı olmaz.

Bunun nedeni, daha eski BluetoothAdapter uygulamasında, SDP girdisinin temizlenmesinin, getDefaultAdapter()'un çağrıldığı iş parçacığı üzerinde oluşturulmuş bir işleyiciye gönderilen bir ileti aracılığıyla gerçekleşmesidir.

3
ne kadar doğru

Emin değilim, ama bu sarıcı işlevi ekledi:

static boolean m_calledLooperAlready = false; 

BluetoothAdapter getDefaultBluetoothAdapter() { 
    if (!m_calledLooperAlready) { 
     try { 
      android.os.Looper.prepare(); 
     } catch (RuntimeException e) { e.printStackTrace(); } 
     m_calledLooperAlready = true; 
    } 
    return BluetoothAdapter.getDefaultAdapter(); 
} 

... ve getDefaultBluetoothAdapter() ile BluetoothAdapter.getDefaultAdapter() tüm oluşumlarını yerini aldı. 2.2.1, 2.3.3, 4.0.4, 4: Bu benim için ok çalışır.3

İlgili konular