Android 通过蓝牙连接到设备,锁定应用程序

Android 通过蓝牙连接到设备,锁定应用程序,android,bluetooth,connection,Android,Bluetooth,Connection,我正在尝试连接到一个实际工作的嵌入式设备,但当我连接时,它会消耗大量资源,应用程序会停止,一段时间后会在强制退出或等待对话框中做出响应 在某个地方读到一个背景线程是解决这个问题的方法,但我不知道如何实现它。我应该作为一种服务吗?。。或实时编程对我来说是很久以前的事了,希望你们能给我一些帮助 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont

我正在尝试连接到一个实际工作的嵌入式设备,但当我连接时,它会消耗大量资源,应用程序会停止,一段时间后会在强制退出或等待对话框中做出响应

在某个地方读到一个背景线程是解决这个问题的方法,但我不知道如何实现它。我应该作为一种服务吗?。。或实时编程对我来说是很久以前的事了,希望你们能给我一些帮助

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.carsetup);
    car1 = (TextView) findViewById(R.id.carsetuptest1);
    car2 = (TextView) findViewById(R.id.carsetuptest2);
    car3 = (TextView) findViewById(R.id.carsetuptest3);
    Intent i = getIntent();
    selectedcar = (CarModule) i.getParcelableExtra("car");
    car1.setText(selectedcar.getRealname());
    car2.setText(selectedcar.getRealname());
    car3.setText(selectedcar.getAddress());

    try {
        for (int c = 0; c < 3; c++) {
            connectBluetooth();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

}
private void connectBluetooth() throws Exception {
    if (connected) {
        return;
    }
    BluetoothDevice car = BluetoothAdapter.getDefaultAdapter().
    getRemoteDevice(selectedcar.getAddress());
    Method m = car.getClass().getMethod("createRfcommSocket",
        new Class[] { int.class });
    sock = (BluetoothSocket)m.invoke(car, Integer.valueOf(1));
    Log.d(selectedcar.getRealname(), "++++ Connecting");
    sock.connect();
    Log.d(selectedcar.getRealname(), "++++ Connected");
}

}
@Override
public void onBackPressed() {
    setResult(RESULT_CANCELED);
    super.onBackPressed();
}
ConnectThread
实现
Runnable
,并具有
run()。问题是UI线程仍然被锁定,我不知道如何锁定。
ThreadHandler
位于正在运行的
活动中:

Handler ThreadHandler = new Handler (){
    public void handleMessage(Message msg) {
        Log.i("MESSAGEHANDLER", "Message "+ msg.arg1 + " recieved" );
        if(msg.arg1 == 0){
            launchAndPrepare();
        }
        if(msg.arg1 == 1 || msg.arg1 == 2){
            search_dialog.dismiss();
            showDialog(DIALOG_BT_ADDING_FAILED);
        }

    }
};

我即将尝试另一种方法,如
AsyncTask
。这对上面的应用程序有效吗?还是我在当前的实现中做了一些不正确的事情?

您的代码打破了Android编程的一条基本规则,即您根本无法在UI线程上执行任何耗时的工作(尤其是与网络相关的),因此您需要使用一些线程。只需遵循Android Bluetooth指南,该指南解释了如何在各个线程中实现连接和连接状态。都在那里

幸运的是,您实际上不需要做什么就可以启动并运行,因为上面链接中讨论的大多数编程已经在蓝牙聊天示例中为您完成了。您可以很快开始使用它,因为它为您提供了一个可用于派生您自己的应用程序的工作应用程序

以上信息提供了有关如何在各个线程中处理蓝牙连接的所有信息

现在,我认为,你是否使用单独的服务来处理蓝牙网络的事情,实际上是一个问题,当用户在手机上做其他事情时,你是否希望能够在几项活动中保持蓝牙连接和/或定期在后台执行网络通信。例如,我目前正在做的应用程序有几个活动类(即几个不同的UI屏幕),它们都使用蓝牙连接到设备。在最初创建连接之后,我希望当用户在活动之间移动时,连接保持正常。此外,我甚至希望在用户执行其他操作时,连接保持在后台,这样我的应用程序就可以继续从设备进行数据记录。因此,对我来说,在服务中实现蓝牙联网是至关重要的。如果您只要求连接在前台的单个活动的持续时间内可用,那么只需在同一个活动中实现所有连接(当然使用线程)就足够了,就像蓝牙聊天示例所做的那样

需要注意的是,使用服务本身并不会将其中包含的代码放在单独的线程上;您放入服务的任何内容仍在主UI线程中运行。如果您确实使用服务,您仍然希望在服务中的不同线程中执行冗长的通信

看起来你的申请是与汽车相关的,这就是我的申请

最后,您通常需要立即对Bluetooth聊天应用程序进行的一个基本修改是更改UUID,使其连接到远程设备的SPP(串行端口)配置文件。例如,如果您正试图通过蓝牙加密狗与车载OBD2通话,则很可能是通过SPP交换串行数据。您将蓝牙聊天示例中的UUID更改为:

// UUID for Serial Port Profile
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

CreateRfcomSocket的反射在某些设备上失败,因为“在引擎盖下”的实现不同-对于没有SDP的设备,使用特殊的UUID 00001101-0000-1000-8000-00805F9B34FB应该可以解决这个问题


PS:请在android问题上加上星号,向谷歌展示像我们这样的用例存在。

我建议在connectBluetooth()部分使用服务。我相信,通过意图传递或其他方式连接后,您可以将服务消息作为主要活动。我已经有一段时间没有做Android编程了,所以我不确定。BlueToothChat示例中的方法给了我一个服务发现错误。我查了一下,找到了。编辑了上面的帖子。如果您能帮助我通过将
new Handler().post(Runnable r)
更改为
new Thread(Runnable r)
然后执行
Thread.start()
// UUID for Serial Port Profile
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");