概述 在 React 16 中为了防止不必要的 DOM 更新,允许你决定是否让 .setState 更来新状态。在调用 .setState 时返回 null 将不再触发更新。...React 16 对状态性能进行了改进,如果新的状态值与其现有值相同的话,通过在 setState 中返回 null 来防止来触发更新。 ?...解决方案 以下是我们将要遵循的步骤,来防止不必要的重新渲染: 检查新的状态值是否与现有值相同 如果值相同,我们将返回 null 返回 null 将不会更新状态和触发组件重新渲染 首先,在 app 组件的...我在下面的两个 GIF 中突出显示了 React DevTools 中的更新: ? 没有从 setState 返回 null ?...总结 本文介绍了在 React 16 中怎样从 setState 返回 null。我在下面的 CodeSandbox 中添加了 mocktail 选择程序的完整代码,供你使用和 fork。
"蓝牙已打开" : "蓝牙未打开"); } }); } 这里声明了一个变量,然后在方法中对变量进行赋值,此方法就替代了之前的startActivityForResult...在返回中可以得知当前是否打开了蓝牙,因为是在Java中使用,因此我们写了一个registerIntent()方法,我们需要在onCreate之前调用这个方法,如图所示: ② 请求BLUETOOTH_CONNECT...,不是就直接打开系统蓝牙,是Android12,再去检查是否授予BLUETOOTH_CONNECT权限,授予了就打开系统蓝牙,没有授予就去请求此权限,不要忘记在onCreate()方法中调用它。...下面我们运行一下: 四、蓝牙扫描 在Android6.0 - Android11.0之间,扫描蓝牙都是需要打开定位权限的,而在Android12中则不需要了,换成了BLUETOOTH_SCAN...六、适配Android12.0以下设备 当前的代码我们在Android12上是没有问题了,但是Android12以下 Android6.0以上 还是扫描不到设备,然后我们回到MainActivity中,
问题描述:在使用laravel的左联接查询的时候遇到一个问题,查询中带了右表一个筛选条件,导致结果没有返回右表为空的记录。...- leftJoin('class as c','c.user_id','=','u.user_id') - where('c.status','=',2) - get(); 解决方案: 1.在mysql...的角度上说,直接加where条件是不行的,会导致返回结果不返回class为空记录,正确是写法应该是 select u.user_id,c.class from users u left join class...u.user_id=c.user_id and c.status=2; 没错,正确写法是left join .. on .. and 而非 left join .. on .. where 2.那么,在laravel...以上这篇解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题就是小编分享给大家的全部内容了,希望能给大家一个参考。
对象与之交互; 如果getDefaultAdapter()返回null,则表示该设备不支持蓝牙, 例如: BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter...启用蓝牙 调用isEnable()以检查当前是否已启用蓝牙; 如果此方法返回false,则表示蓝牙处于停用状态; 要请求启用蓝牙,将通过ACTION_REQUEST_ENABLE向系统设置 发出启用蓝牙的请求...device.getAddress()); } } 查找设备——发现设备 发现设备:startDiscovery() 该进程为异步进程, 该方法会立即返回一个布尔值...(BluetoothDevice.EXTRA_DEVICE); Log.d(TAG, "new Device name " + device.getName());//...(BluetoothDevice.EXTRA_DEVICE); Log.d(TAG, "new Device name " + device.getName());//
下面是BluetoothAdapter的常用方法说明。...下面是BluetoothDevice的常用方法说明。...:根据UUID创建并返回一个BluetoothSocket。...下面是常用的方法说明。...() == BluetoothDevice.BOND_BONDED) { tv_discovery.setText("完成配对" + device.getName()); mHandler.postDelayed
背景介绍笔者最近在开发小程序,发现在使用new Date()函数在电脑模拟器上倒是没什么影响能很好实现效果,但是在我的Iphone上看到的效果跟预想有出入。...图为在电脑微信小程序模拟器的效果图,可以看到感觉良好。图片图为在世界最好用的手机产品Iphone上的效果,可以看到和模拟器有出入,这个日期生成有问题。...图片图为笔者使用VConsole打出来的结果,可以看到为null,这个new Date()失败!!!图片公布答案既然事情已经发生,那我们就简单地分析下为什么?
背景介绍 笔者最近在开发小程序,发现在使用new Date()函数在电脑模拟器上倒是没什么影响能很好实现效果,但是在我的Iphone上看到的效果跟预想有出入。...图为在电脑微信小程序模拟器的效果图,可以看到感觉良好。 图为在世界最好用的手机产品Iphone上的效果,可以看到和模拟器有出入,这个日期生成有问题。...图为笔者使用VConsole打出来的结果,可以看到为null,这个new Date()失败!!! 公布答案 既然事情已经发生,那我们就简单地分析下为什么?
蓝牙权限 首先需要AndroidManifest.xml文件中添加操作蓝牙的权限。...BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler, REQUEST_ENABLE); //不做提示,直接打开,不建议用下面的方法...if(scanDevice == null || scanDevice.getName() == null) return; Log.d(TAG, "name="+scanDevice.getName...= STATE_CONNECTED) { try { // 这是一个阻塞调用 返回成功的连接...// mServerSocket.close()在另一个线程中调用,可以中止该阻塞 socket = mServerSocket.accept();
BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enabler, REQUEST_ENABLE); //不做提示,直接打开,不建议用下面的方法...// mBluetoothAdapter.enable(); } 获取本地蓝牙信息和已配对设备 连接中的设备不能在搜索回调中获取 只能在以配对设备中获取 //获取本机蓝牙名称 String name...); if(scanDevice == null || scanDevice.getName() == null) return; Log.d(TAG...= STATE_CONNECTED) { try { // 这是一个阻塞调用 返回成功的连接...// mServerSocket.close()在另一个线程中调用,可以中止该阻塞 socket = mServerSocket.accept();
由于选择弹窗上面可选择“允许”还是“拒绝”,因此代码中要重写onActivityResult函数,在该函数中判断蓝牙权限的选择结果。...不过因为搜索动作是个异步的过程,startDiscovery方法并不直接返回搜索发现的设备结果,而是通过广播BluetoothDevice.ACTION_FOUND返回新发现的蓝牙设备。...所以页面代码需要注册一个蓝牙搜索结果的广播接收器,在接收器中解析蓝牙设备信息,再把新设备添加到蓝牙设备列表。...下面是BluetoothDevice类的常用方法说明: getName : 获取设备的名称。 getAddress : 获取设备的MAC地址。 getBondState : 获取设备的绑定状态。...由于配对请求需要在界面上手工确认,因此配对结果只能通过异步机制返回,此处的结果返回仍然采取广播形式,即系统会发出广播BluetoothDevice.ACTION_BOND_STATE_CHANGED通知
搜索设备并进行配对(即添加好友) 简单的调用startDiscovery()方法就可以开始发现设备。该过程是异步的,并且该方法会立即返回一个布尔值来指明发现处理是否被成功的启动。...2、通过调用accept()方法,启动连接请求。这是一个阻塞调用。只有在连接被接收或发生异常的情况下,该方法才返回。...只有在发送连接请求的远程设备所携带的UUID跟监听服务套接字所注册的一个UUID匹配的时候,该连接才被接收。连接成功,accept()方法会返回一个被连接的BluetoothSocket对象。...3、除非你想要接收其他连接,否则要调用close()方法。该方法会释放服务套接字以及它所占用的所有资源,但不会关闭被连接的已经有accept()方法所返回的BluetoothSocket对象。...在这个调用中,为了找到匹配的UUID,系统会在远程的设备上执行一个SDP查询。如果查询成功,并且远程设备接收了该连接请求,那么它会在连接期间共享使用RFCOMM通道,并且connect()方法会返回。
从方法签名的组成规则我们可以看出,方法的返回类型不是方法签名的组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同的方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名的一部分呢?...,所以方法的返回类型不能作为方法签名的一部分。...总结 在同一个类中定义了多个同名方法,但每个方法的参数类型或者是参数个数不同就是方法重载。方法重载的典型使用场景是 String 中的 valueOf 方法,它有 9 种实现。...方法返回类型不能作为方法重载的依据,因为它不是方法签名的组成部分。
Set<BluetoothDevice blueDevices = mBluetoothAdapter.getBondedDevices(); if (blueDevices == null ||...int profile) 接着又尝试了这两个方法,方法是可用,但是必须要求设备sdk 18,即android 4.3版本以上才可用。...; } } Activity中重写dispatchKeyEvent方法,截取Key事件。...因此为了更好的兼容,可以采用如下方法, /** * 判断是否已经连接扫码枪 * @return */ protected boolean hasScanGun() { Set<BluetoothDevice...() == BluetoothClass.Device.Major.PERIPHERAL) { return isInputDeviceUsed(bluetoothDevice.getName());
device,若存在就将device返回,若不存在就返回null CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice...(); } 当远程设备发生改变时会发送ACTION_BOND_STATE_CHANGED的广播,在注册的handler中调用readPairedDevices()方法读取配对设备。...iii>,设备列表的改变 当设备状态发生变化时设备列表的显示也要发生变化,诸如设备进行配对,取消配对等操作,在BluetoothEvenManager.java中对设备的状态进行监听并处理,在该类的构造方法中注册了许多的监听器...); //获取到远程设备后检测是否在缓存列表中,若有就返回设备,若没有返回null CachedBluetoothDevice cachedDevice...,配对成功后进行自动连接 //该方法返回true代表正在进行配对操作,若返回false则表示配对操作失败弹出失败弹窗 boolean startPairing() { //首先查看一下
android:name="android.permission.BLUETOOTH" / 2.在文件res / values / strings.xml里,添加程序运行过程中的状态描述文本及配色代码等...然后在 run 方法中 connect , 成功后调用 BluetoothChatSevice 的 connected() 方法。定义 cancel() 在关闭线程时能够关闭相关socket 。...run()方法中使用阻塞模式的 InputStream.read()循环读取输入流,然后发送到 UI 线程中更新聊天消息。...= BluetoothDevice.BOND_BONDED) { mNewDevicesArrayAdapter.add(device.getName() + "\n" + device.getAddress...getApplicationContext(), msg.getData().getString(TOAST), Toast.LENGTH_SHORT).show(); break; } } }; //返回进入好友列表操作后的数回调方法
devices); listView.setAdapter(adapter); } } 这里需要提一下的是,startDiscovery()这个方法和它的返回值...搜索过程其实是在System Service中进行,我们可以通过cancelDiscovery()方法来停止这个搜索。...在系统搜索蓝牙设备的过程中,系统可能会发送以下三个广播:ACTION_DISCOVERY_START(开始搜索), ACTION_DISCOVERY_FINISHED(搜索结束) 和ACTION_FOUND..., EXTRA_DEVICE中的BluetoothDevice就是我们搜索到的设备对象,从中获得设备的名称和地址。...在谷歌提供的例子中,我们可以看到谷歌的程序员的程序水平很高,一些好的编码习惯我们可以学习一下,像是在try..catch中才定义的变量,我们应该在try…catch之前声明一个临时变量,然后再在try…
startDiscovery()方法是一个异步方法,调用后会立即返回。...该方法调用后,搜索过程实际上是在一个System Service中进行的,所以可以调用cancelDiscovery()方法来停止搜索(该方法可以在未执行discovery请求时调用)。...(action)) { // 从Intent中获取设备对象 BluetoothDevice device = intent.getParcelableExtra...(UUID用于客户端与服务器端之间的配对) 调用BluetoothServerSocket的accept()方法监听连接请求,如果收到请求,则返回一个BluetoothSocket实例(此方法为block...accept,则connect()方法返回 注意:在调用connect()方法之前,应当确定当前没有搜索设备,否则连接会变得非常慢并且容易失败private class ConnectThread extends
文件中添加权限,这个是必须要的 //在程序中使用蓝牙功能 ...mBluetoothAdapter.isEnabled()){ boolean enable = mBluetoothAdapter.enable(); //返回值表示 是否成功打开了蓝牙功能...device : pairedDevices){ //通过array adapter在列表中添加设备名称和地址 mArrayAdapter.add...(device.getName() + "\n" + device.getAddress()); Log.i("bluetooth",device.getName() +...} } }; 记得在onCreate()方法中注册广播: IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND
配置文件是设备在特定应用程序中的工作方式的规范。 请注意,设备可以实现多个配置文件。 例如,设备可以包含心率监视器和电池水平检测器。 属性协议(ATT) -GATT建立在属性协议(ATT)之上。...BLE权限 首先,需要在manifest中声明使用蓝牙和操作蓝牙的权限 在应用程序清单文件中声明蓝牙权限。...onDescriptorWriteRequest (2) 在 onDescriptorWriteRequest 方法中,执行下面的方法表示 写入成功 BluetoothGatt.GATT_SUCCESS...onCharacteristicWriteRequest (3) 在 onCharacteristicWriteRequest方法中 public void onCharacteristicWriteRequest...()方法 回复数据 通过日志,我们看看事件触发的顺序 1.onConnectionStateChange:device name = null, address = 74:32:DE:49:3C:28
// 判断手机是否支持蓝牙 if (mBluetoothAdapter == null) { Toast.makeText(this, "设备不支持蓝牙", Toast.LENGTH_SHORT)...device : pairedDevices) { // 遍历 mDevicesList.add(device.getAddress()); tvDevices.append(device.getName...IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); // 注册广播 registerReceiver(receiver, filter); 搜索蓝牙的方法...void scanBluth() { // 设置进度条 setProgressBarIndeterminateVisibility(true); setTitle("正在搜索..."); // 判断是否在搜索...(action)) { // 从intent中获取设备 BluetoothDevice device = intent .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE
领取专属 10元无门槛券
手把手带您无忧上云