[英]Connecting to device via bluetooth, locked app
我正在嘗試連接到實際工作的嵌入式設備,但是當我連接時它會消耗大量資源並且應用程序會停止,一段時間后會在強制退出或等待對話框中做出響應。
在某處閱讀背景線程將成為 go 的方式,但我不知道如何實現它。 我應該把它作為一項服務嗎?...還是? 實時編程對我來說是很久以前的事了,如果你們能提供一些幫助,我們將不勝感激。
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()
它失敗了。 那么我將如何 go 關於這個問題?
編輯:所以我一直在探索不同的選擇,但它仍然被鎖定。 現在我嘗試將線程實現為 Runnable 並通過 Handler 以下列方式執行它們:
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()
。 問題是 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
。 這適用於上面的應用程序嗎? 還是我在當前的實施中做錯了什么?
您的代碼違反了關於 Android 編程的基本規則,因為您根本無法在 UI 線程上執行任何耗時的工作(尤其是與網絡相關的工作),因此您需要使用一些線程。 只需遵循 Android 藍牙指南,該指南解釋了如何在各個線程中實現連接和連接狀態。 這一切都在那里。
http://developer.android.com/guide/topics/wireless/bluetooth.html
幸運的是,啟動和運行您實際上需要做的事情很少,因為上面鏈接中討論的大部分編程已經在藍牙聊天示例中為您完成。 您可以很快開始使用它,因為它為您提供了一個工作應用程序,您可以使用它來派生您自己的應用程序。
http://developer.android.com/resources/samples/BluetoothChat/index.html
以上信息提供了您需要了解的有關如何在各個線程中處理藍牙連接的所有信息。
現在,我認為,您是否使用單獨的服務來處理藍牙網絡問題,實際上是一個問題,即您是否希望能夠為多個活動維護藍牙連接和/或在用戶使用時在后台定期執行網絡通信正在手機上做其他事情。 例如,我目前正在做的應用程序有幾個 Activity 類(即幾個不同的 UI 屏幕),它們都使用藍牙連接到設備。 最初創建連接后,我希望連接在用戶在活動之間移動時保持連接。 此外,我什至希望在用戶執行其他操作時連接保持在后台,以便我的應用程序可以繼續從設備進行數據記錄。 因此,對我來說,在服務中實現藍牙網絡是必不可少的。 如果您只需要連接在單個 Activity 處於前台時可用,那么就像藍牙聊天示例一樣,只需在同一個 Activity 中實現所有連接(當然使用線程)就足夠了。
需要注意的是,使用 Service 本身並不會將其中包含的代碼放在單獨的線程上; 您放入 Service 的任何內容仍在主 UI 線程中運行。 如果您確實使用服務,您仍然希望在服務的單獨線程中執行冗長的通信內容。
看起來您的應用程序與汽車相關,這就是我的應用程序。
最后一點,您通常需要立即對藍牙聊天應用程序進行的一項基本修改是更改 UUID,以便它連接到遠程設備的 SPP(串行端口)配置文件。 例如,如果您碰巧嘗試將汽車 OBD2 與藍牙加密狗進行通信,那么它很可能是通過 SPP 交換串行數據。 您將藍牙聊天示例中的 UUID 更改為:
// UUID for Serial Port Profile
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
由於“幕后”的不同實現,createRfcommSocket 的反射在某些設備上失敗 - 對沒有 SDP 的設備使用特殊的 UUID 00001101-0000-1000-8000-00805F9B34FB 應該可以為您解決問題
PS:請給問題 android 問題http 加注星號://code.google.com/p/android/issues/detail?id=5427向谷歌表明存在像我們這樣的用例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.