2011-06-30 63 views
2

我试图连接到一个实际可以工作的嵌入式设备,但是当我连接它时,会消耗大量资源,并且应用程序停止响应一段时间后会响应强制退出或等待对话框。通过蓝牙连接到设备,锁定的应用程序

在某处读了一个backgroundthread,可以解决这个问题,但我不知道如何实现它。我应该把它作为服务吗?..或者?实时编程很早以前对我来说很有帮助,我们会对你们的帮助表示赞赏。

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(); 
} 

它在sock.connect()它失败。那么我该如何解决这个问题呢?

编辑: 所以我一直在探索不同的选择,但它仍然锁定。现在,我试图执行线程的Runnable接口,并通过处理器通过以下方式执行它们:

void connectBluetooth(boolean nextstage, IOException e1){ 
    if(!nextstage){ 
     showDialog(DIALOG_BT_ADDING); 
     new Handler().post(new ConnectThread(ThreadHandler, selected_car.getDevice())); 
    } 
    else{ 
     if(e1 != null){ 
      new Handler().post(new BluetoothCheckThread(ThreadHandler,mBluetoothAdapter, 
        5000, car_bt, after_bt)); 
      search_dialog.dismiss(); 
     } 
     else{ 
      showDialog(DIALOG_BT_ADDING_FAILED); 
     } 


    } 
} 

ConnectThread实现Runnable,具有run() overidden。问题是UI线程仍然被锁定,我不知道如何。 ThreadHandler位于运行Activity

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另一种方法的边缘。这将在上面的应用程序工作吗?或者我在当前的实施中做了些不正确的事情?

+0

我建议使用一个服务为connectBluetooth()部分。我相信你可以在通过Intent传递或其他东西连接之后获得主要活动的服务消息。我有一段时间没有进行Android编程,所以我不确定。 –

回答

4

您的代码违反了关于Android编程的基本规则,因为您无法在UI线程上执行任何耗时的工作(特别是与网络相关的工作),因此您需要使用一些线程。只需按照Android蓝牙指南解释如何在各个线程中实现连接和连接状态。它在那里。

http://developer.android.com/guide/topics/wireless/bluetooth.html

幸好有很少你真正需要做的就是启动和运行,因为大多数在上面的链接中讨论了编程的为您的蓝牙聊天例子已经完成。你可以很快就开始使用它,因为它提供了一个可用于从中派生自己的应用程序的工作应用程序。

http://developer.android.com/resources/samples/BluetoothChat/index.html

上述信息提供了所有你需要知道的关于如何处理各个线程蓝牙连接。

现在,无论您是否使用单独的服务来处理蓝牙网络,我认为这确实是一个问题,您是否希望能够维护多个活动的蓝牙连接和/或定期执行网络通信当用户在手机上做其他事情时的背景。例如,我目前正在做的应用程序有几个活动类(即几个不同的UI屏幕),都使用蓝牙连接到设备。在最初创建连接后,我希望在用户在活动之间移动时保持连接状态。此外,我甚至希望连接保持在后台,而用户正在做其他事情,以便我的应用程序可以继续从设备进行数据记录。因此,对我而言,在服务中实施蓝牙网络至关重要。如果您只需要连接在前台运行一段时间的情况下可用,那么就可以将它全部实现在同一个活动中(但当然使用线程),就像蓝牙聊天示例一样。

需要注意的是,使用服务本身并不是不是把代码包含在一个单独的线程;任何你放入服务的东西仍然在主UI线程中运行。如果您使用服务,您仍然希望在服务中的单独线程内执行冗长的通信内容。

它看起来像你的应用程序是汽车相关的,这是我的。

最后,您通常需要对蓝牙聊天应用程序进行一个基本的修改,即更改UUID,以便连接到远程设备的SPP(串行端口)配置文件。例如,如果您碰巧试图将车载OBD2与蓝牙适配器进行通话,那么它很可能通过SPP交换串行数据。您在蓝牙聊天例如更改UUID到:

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

BlueToothChat示例中的方法给了我一个服务发现错误。我检查了一些东西,发现[这里的链接](http://stackoverflow.com/questions/3397071/android-bluetooth-service-discovery-failed-exception)。 – Mazze

+0

良好的联系 - 我会读一读。 – Trevor

+0

编辑上面的帖子。 – Mazze

2

createRfcommSocket的反思,因为“引擎盖下”不同的实现方式的某些设备发生故障 - 使用特殊的UUID 00001101-0000-1000-8000-00805F9B34FB为没有SDP设备应该做的伎俩为您

PS:请明星这个问题的Android问题http://code.google.com/p/android/issues/detail?id=5427表明,用例像我们这样存在谷歌..