码迷,mamicode.com
首页 > 移动开发 > 详细

Android蓝牙开发,报BluetoothAdapter﹕ Can't create handler inside thread that has not called Looper.prepare

时间:2015-08-12 19:31:29      阅读:165      评论:0      收藏:0      [点我收藏+]

标签: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()方法,结果果然解决了。修改后代码如下:

 // 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的时间,特写此博客,告知!

版权声明:本文为博主原创文章,转载请注明来自:http://blog.csdn.net/kimyo8337373/article/category/2608037

Android蓝牙开发,报BluetoothAdapter﹕ Can't create handler inside thread that has not called Looper.prepare

标签:android   蓝牙   

原文地址:http://blog.csdn.net/kimyo8337373/article/details/47448079

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!