【发布时间】:2012-07-06 05:22:33
【问题描述】:
我正在尝试连接到实际工作的嵌入式设备,但是当我连接时它会消耗大量资源并且应用程序会停止,一段时间后会在强制退出或等待对话框中做出响应。
在某处阅读背景线程将是解决此问题的方法,但我不知道如何实现它。我应该把它作为一项服务吗?...还是?实时编程对我来说是很久以前的事了,希望你们能提供一些帮助。
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 并通过 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。这适用于上面的应用程序吗?还是我在当前的实现中做错了什么?
【问题讨论】:
-
我建议为 connectBluetooth() 部分使用服务。我相信在通过 Intent 传递或其他方式连接后,您可以将服务消息作为主要活动。好久没做安卓编程了,不太清楚。
标签: android bluetooth connection