public boolean push(final DmrDevice device, final MediaInfo media, Handler handler) {
   if (getCurrentAction(device, handler) != PlayState.STOPPED) {
     boolean stopresult = stop(device, handler);
     log.warning("play state is not stopped ,stop the play->" + stopresult);
     try {
       Thread.sleep(1000);
     } catch (InterruptedException e) {
       e.printStackTrace();
       return false;
     }
   }
   if (!checkActionIsPrepared()) return false;
   pushingMedia = media;
   Service<?, ?> dlnaService = device.findService(AV_TRANSPORT_TYPE);
   if (dlnaService == null) {
     return false;
   }
   final SetAVTransportURIImpl action =
       new SetAVTransportURIImpl(
           dlnaService, media.getPushUrl().trim(), media.getMetaData(), Thread.currentThread());
   handler.post(
       new Runnable() {
         @Override
         public void run() {
           log.warning("action for service to execute->" + action.toString());
           service.getControlPoint().execute(action);
         }
       });
   blockCurrentThread();
   if (action.getResult() == true) {
     return resume(device, handler);
   }
   return action.getResult();
 }
 public void startSync(final DmrDevice device, final OnDeviceStateChangeListener listener) {
   if (handlers.containsKey(device.getUdn())) {
     return;
   }
   HandlerThread thread = new HandlerThread(String.valueOf(System.currentTimeMillis()));
   thread.start();
   Handler actionHandler = new Handler(thread.getLooper());
   // 如果当前线程没有Looper,需要创建Looper对象
   if (Looper.myLooper() == null) {
     Looper.prepare();
     SyncHandler handler = new SyncHandler(Looper.myLooper(), device, listener, actionHandler);
     handlers.put(device.getUdn(), handler);
     handler.start();
     Looper.loop();
   } else {
     SyncHandler handler = new SyncHandler(Looper.myLooper(), device, listener, actionHandler);
     handlers.put(device.getUdn(), handler);
     handler.start();
   }
 }
 public boolean getMute(final DmrDevice device, Handler handler) {
   if (!checkActionIsPrepared()) return false;
   Service<?, ?> dlnaService = device.findService(RENDERING_CONTROL_TYPE);
   if (dlnaService == null) {
     return false;
   }
   final GetMuteImpl action = new GetMuteImpl(dlnaService, Thread.currentThread());
   handler.post(
       new Runnable() {
         @Override
         public void run() {
           service.getControlPoint().execute(action);
         }
       });
   blockCurrentThread();
   return action.getResult();
 }
 public long getPositionInfo(final DmrDevice device, Handler handler) {
   if (!checkActionIsPrepared()) return -1;
   Service<?, ?> dlnaService = device.findService(AV_TRANSPORT_TYPE);
   if (dlnaService == null) {
     return -1;
   }
   final GetPositionInfoImpl action = new GetPositionInfoImpl(dlnaService, Thread.currentThread());
   handler.post(
       new Runnable() {
         @Override
         public void run() {
           service.getControlPoint().execute(action);
         }
       });
   blockCurrentThread();
   return action.getPosition();
 }
 public boolean seek(final DmrDevice device, final long millisecond, Handler handler) {
   if (!checkActionIsPrepared()) return false;
   Service<?, ?> dlnaService = device.findService(AV_TRANSPORT_TYPE);
   if (dlnaService == null) {
     return false;
   }
   final SeekImpl action =
       new SeekImpl(dlnaService, parseMillisecond(millisecond), Thread.currentThread());
   handler.post(
       new Runnable() {
         @Override
         public void run() {
           service.getControlPoint().execute(action);
         }
       });
   blockCurrentThread();
   return action.getResult();
 }
 public boolean isSyncing(final DmrDevice device) {
   return handlers.containsKey(device.getUdn());
 }
 public void stopSync(final DmrDevice device) {
   SyncHandler handler = handlers.get(device.getUdn());
   if (handler == null) return;
   handler.stop();
   handlers.remove(device.getUdn());
 }