我有一个Android应用程序,其服务连接到外围设备并监听其输出。与外围设备的连接是在服务的onStartCommand()
方法中启动的。
建立连接涉及几个“有希望”,有时可能会因例外而失败。
如何防止服务成为正在运行但与监视器无关的僵尸?从stopSelf()
内拨打onStartCommand()
似乎不起作用。
粗略代码:
public int onStartCommand(Intent intent, int flags, int startId) {
try {
// connect to device
} catch (ConnectToDeviceException e) {
stopSelf();
}
return START_REDELIVER_INTENT;
}
答案 0 :(得分:1)
我通过将连接代码移动到AsyncTask
并在连接失败时从那里停止服务来解决它。
由于onStartCommand()
在UI线程上运行并且连接到设备可能需要一些时间,因此无论如何,通过将其置于AsyncTask
中而将其从UI线程中移除是更清洁的。
简化代码:
public int onStartCommand(Intent intent, int flags, int startId) {
StartupTask startupTask = new StartupTask();
startupTask.execute();
return START_REDELIVER_INTENT;
}
private class StartupTask extends AsyncTask<Void, Void, Void> {
boolean success = true;
@Override
protected Void doInBackground(Void... params) {
try {
// connect to device
} catch (ConnectToDeviceException e) {
success = false;
}
}
@Override
protected void onPostExecute(Void result) {
if (!success)
stopSelf();
}
}