Я создал службу широковещания, которая содержит runnables, которые должны ждать ввода, она запускает первый runnable inline хотя бы один раз, но не добавляет ни одного из других и не ждет и слушает.Android-поток не дождался только один раз
public class MainService extends Service {
// Manager device;
Emitter emitter;
RFIDPhidget device;
Service service;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// For time consuming an long tasks you can launch a new thread here...
Toast.makeText(this, " Service Started", Toast.LENGTH_LONG).show();
}
/** Called when the activity is first created. */
@Override
public void onCreate() {
// LinearLayout lin_out = (LinearLayout)findViewById(R.id.lineout);
// lin_out.setVisibility(View.GONE);
Toast.makeText(this, " Service CREATED", Toast.LENGTH_LONG).show();
try
{
com.phidgets.usb.Manager.Initialize(this);
//device = new Manager();
device = new RFIDPhidget();
service = this;
emitter = new Emitter(this);
device.addAttachListener(new AttachListener() {
public void attached(final AttachEvent attachEvent) {
AttachEventHandler handler = new AttachEventHandler((RFIDPhidget)attachEvent.getSource(), service);
handler.run();
synchronized(handler) {
try {
handler.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
device.addDetachListener(new DetachListener() {
public void detached(final DetachEvent detachEvent) {
DetachEventHandler handler = new DetachEventHandler((RFIDPhidget)detachEvent.getSource(), service);
handler.run();
synchronized(handler) {
try {
handler.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
device.addTagGainListener(new TagGainListener() {
public void tagGained(TagGainEvent oe) {
TagGainedHandler handler = new TagGainedHandler(oe, emitter);
handler.run();
synchronized(handler)
{
try {
handler.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
device.addTagLossListener(new TagLossListener() {
public void tagLost(TagLossEvent oe) {
TagLossHandler handler = new TagLossHandler(oe, emitter);
handler.run();
synchronized(handler)
{
try {
handler.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
device.openAny();
} catch (PhidgetException pe) {
pe.printStackTrace();
}
}
@Override
public void onDestroy() {
super.onDestroy();
try {
device.close();
} catch (PhidgetException e) {
e.printStackTrace();
}
com.phidgets.usb.Manager.Uninitialize();
}
}
Я использовал для запуска всего этого кода в деятельности и использовании, runOnUIThread(handler);
для каждого переменного слушателя handler'but, так как это не возможно, в сфере услуг я начал только с помощью handler.run();
.
Он запускает AttachEventHandler, по крайней мере, он не запускает другие и не ждет его. Вот пример кода внутри слушателей.
public class AttachEventHandler implements Runnable {
RFIDPhidget device;
Service main_service;
public AttachEventHandler(RFIDPhidget device, Service main_service) {
this.device = device;
this.main_service = main_service;
}
public void run() {
try {
device.setAntennaOn(true);
device.setLEDOn(true);
Toast.makeText(main_service, "Hello " + device.getDeviceName() + ", Serial " + Integer.toString(device.getSerialNumber()), Toast.LENGTH_LONG);
} catch (PhidgetException e) {
e.printStackTrace();
}
// Notify that we're done
synchronized(this) {
this.notify();
}
}
Все слушатели идентичны для того, что происходит в их функциях try.
Мне нужна помощь в выяснении того, как заставить их ждать или, по крайней мере, продолжать работать в фоновом режиме, вот в чем причина, по которой я перешел на службу, поэтому я не был бы зависимым от пользовательского интерфейса.
Если вам нужна дополнительная информация, не бойтесь спросить.
нет нити Inthe коды вы вывесили – Blackbelt
Внимания: Android Сервис работает на «главное» поток, если вы (разработчика) код, чтобы начать или использовать ... что это было? IntentService - я верю. – Fildor
Из [Разработчик Android] (http://developer.android.com/guide/components/services.html): «IntentService выполняет следующие действия: • Создает рабочий поток по умолчанию, который выполняет все намерения, переданные onStartCommand() отдельно из основного потока вашего приложения. • Создает рабочую очередь, которая одновременно передает одно намерение вашей реализации onHandleIntent(), поэтому вам не придется беспокоиться о многопоточности. • Остановка службы после обработки всех запросов на запуск, так что вам никогда не нужно называть stopSelf(). • ... " – Fildor