gpt4 book ai didi

android - 如何关闭 BluetoothSocket 在 Android 中的屏幕旋转?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:30 25 4
gpt4 key购买 nike

我正在制作一个使用蓝牙连接的应用程序。我在 onCreate() 中调用蓝牙连接并在 MainActivityonDestroy() 中关闭它:

// Bluetooth
private Bluetooth bt;
private boolean registered = false;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

bt = new Bluetooth(this);
bt.enableBluetooth();
bt.setCommunicationCallback(this);
bt.connectToName(bt.getBluetoothDevice(this));
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(mReceiver, filter);
registered = true;
}

@Override
public void onDestroy() {
super.onDestroy();
if(registered) {
unregisterReceiver(mReceiver);
registered=false;
}
bt.removeCommunicationCallback();
bt.disconnect();
if (handler != null && runnable != null) {
handler.removeCallbacks(runnable);
}
}

该应用程序还支持横向和纵向模式(使用两种不同的布局)。当屏幕旋转时,由于布局不同,MainActivity 调用onCreate()onDestroy 函数。因此,我收到以下错误:

@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree addr=0x5a71aa38
A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1051 (le.bluetoothled)

正如我在 Invalid heap address and fatal signal 11 中发现的那样,它来自 BluetoothSocket 的 close() 方法。首先,我认为旋转屏幕时不需要关闭蓝牙,因此,我尝试使用手机的 detect rotation event 方法并在旋转发生时忽略关闭,但是,它不起作用。因此,我认为我们可能需要在屏幕旋转时关闭蓝牙,但我收到了上述错误。我不知道我该如何解决这个问题,你能帮我解决这个问题吗?我将 this 蓝牙库与 disconnect() 一起使用,如下所示:

public void disconnect() {
try {
socket.close();
} catch (IOException e) {
if(communicationCallback!=null)
communicationCallback.onError(e.getMessage());
}
}

因为我目前的解决方案是使用 sleep 。我在关闭套接字之前添加了 Thread.sleep (1000)。这是工作。但我认为这不是一个很好的解决方案。

最佳答案

您不得在 Activity(参见 SOLID)原则中使用与蓝牙相关的内容。 Activity 只是一个 UI。您应该创建单独的服务,该服务将在后台独立于 UI 运行并管理所有与蓝牙相关的操作。从您的 Activity 绑定(bind)到 onResume() 方法中的该服务,并在 onPause() 方法中解除绑定(bind)。您可以从 ServiceConnection 获取 bt-control 接口(interface),该接口(interface)在绑定(bind)期间由 Service 传递。Google 提供了一个很棒的蓝牙示例 - https://github.com/googlesamples/android-BluetoothChat .唯一的缺点 - 它使用 Handler 来传递消息。我稍微修改了一下 - 现在有另一个线程,接收所有状态消息并调用回调。随意使用此代码: https://github.com/AlexShutov/LEDLights

关于android - 如何关闭 BluetoothSocket 在 Android 中的屏幕旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39558525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com