2015-09-15 4 views
0

Я создал службу широковещания, которая содержит 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.

Мне нужна помощь в выяснении того, как заставить их ждать или, по крайней мере, продолжать работать в фоновом режиме, вот в чем причина, по которой я перешел на службу, поэтому я не был бы зависимым от пользовательского интерфейса.

Если вам нужна дополнительная информация, не бойтесь спросить.

+1

нет нити Inthe коды вы вывесили – Blackbelt

+0

Внимания: Android Сервис работает на «главное» поток, если вы (разработчика) код, чтобы начать или использовать ... что это было? IntentService - я верю. – Fildor

+0

Из [Разработчик Android] (http://developer.android.com/guide/components/services.html): «IntentService выполняет следующие действия: • Создает рабочий поток по умолчанию, который выполняет все намерения, переданные onStartCommand() отдельно из основного потока вашего приложения. • Создает рабочую очередь, которая одновременно передает одно намерение вашей реализации onHandleIntent(), поэтому вам не придется беспокоиться о многопоточности. • Остановка службы после обработки всех запросов на запуск, так что вам никогда не нужно называть stopSelf(). • ... " – Fildor

ответ

0

Вам нужно вызвать своих обработчиков, как новый Thread (handler) .start(); вместо handler.run();

потому запуск, выполняется в одном потоке, так что вы не получите ждать/уведомите

+0

'Thread t = new Thread (handler); t.start(); 'дает мне эту ошибку. AndroidRuntime (2874): java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызвал Looper.prepare() –

Смежные вопросы