Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android藍牙開發,報BluetoothAdapter﹕ Can't create handler inside thread that has not called Looper.prepare

Android藍牙開發,報BluetoothAdapter﹕ Can't create handler inside thread that has not called Looper.prepare

編輯:關於Android編程

這個錯誤翻譯的意思是:不能在沒有Looper.prepare的線程裡面創建handler。

起初我很疑惑,我根本沒有用到工作線程,也沒有創建handler。報錯的代碼如下:

    // Device scan callback.
    private BluetoothAdapter.LeScanCallback mLeScanCallback =
            new BluetoothAdapter.LeScanCallback() {

                @Override
                public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {

                    final iBeaconClass.iBeacon ibeacon = iBeaconClass.fromScanData(device, rssi, scanRecord);

                    if (mFilter.isDevice(ibeacon)) {
                        scanLeDevice(false);//停止掃描

                        T.showShort(getActivity(), getString(R.string.sign_in_success));
                        AppSettings.setPrefString(getActivity(), Config.ISSIGNIN, mCurrentDate);
                        setButtonState();//改變按鈕的狀態
                        DialogUtils.proGone();
                       // mControl.closeBlue();//關閉藍牙
                      }
                }
            };

百度了下,網上的做法是如下:

Looper.prepare();
BluetoothAdapter.getDefaultAdapter();

在獲取BluetoothAdapter的之前,加上Looper.prepare();,然並卵。問了很多人,都說不知,這時候這能自力更生了。最後終於被我找到解決辦法。

思路:我查看了SDK的源碼,發現原來我再調用Toast的時候,創建了handler,源碼如下,

這裡寫圖片描述
當我查看TN這個類的時候,就發現了問題的所在
這裡寫圖片描述

類 TN 是一個aidl的.Stub的子類,而Toast的顯示和隱藏都是通過此類進行通信的,而裡面使用handler,具體原理我就不深究下去了。我於是猜想 new BluetoothAdapter.LeScanCallback()的onLeScan可能並沒有運行在主線程,於是我調用了runOnUiThread()方法,結果果然解決了。修改後代碼如下:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> // Device scan callback. private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { final iBeaconClass.iBeacon ibeacon = iBeaconClass.fromScanData(device, rssi, scanRecord); if (mFilter.isDevice(ibeacon)) { scanLeDevice(false);//停止掃描 getActivity().runOnUiThread(new Runnable() {//UI線程的控件改變狀態,需要調用此方法,不然可能會無效 @Override public void run() { T.showShort(getActivity(), getString(R.string.sign_in_success)); AppSettings.setPrefString(getActivity(), Config.ISSIGNIN, mCurrentDate); setButtonState(); DialogUtils.proGone(); // mControl.closeBlue();//關閉藍牙 } }); } } };

到此,問題已解決,為了讓其他同道碰到此問題,而減少尋找bug的時間,特寫此博客,告知!

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved