2014-12-03 3 views
0

У меня есть реализация, как показано ниже, она возвращает js, созданный на ходу, в метод webview shouldInterceptRequest, но мне нужно сделать запросы int it и дождаться ответа, прежде чем возвращать inputStream. Как я могу заставить его ждать этого.Как использовать новый поток в методе синхронизации

Я могу подготовить и синхронизировать запрос для этого, и он решает проблему, но я просто задаюсь вопросом, есть ли способ сделать это с помощью новой темы.

MRURLProtocol.mapDomain("gamification.fs", new MRProtocolResponseHandler() { 
      @Override 
      public InputStream handle(Uri uri) { 
      InputStream stream = null; 
       myApplication.getChamp().getImpulser().invokeRequest(method, body,new OnWebApiResponseArrived() { 
        @Override 
        public void OnSuccess(Object obj) { 
         String configString = "(function() { if (typeof(window) === 'undefined') ..... %s ...."; 
         configString = String.format(configString, obj); 
         stream = new ByteArrayInputStream(configString.getBytes()); 
        } 

        @Override 
        public void OnFail(String errMsg) { 
         String configString = "(function() { if (typeof(window) === 'undefined')..... %s ...."; 
         configString = String.format(configString, errMsg); 
         stream = new ByteArrayInputStream(configString.getBytes()); 
        } 
       }); 
       // NEED TO WAIT FOR stream before return 

       return stream; 
      } 
     }); 

запрос Invoke (чтобы показать, что она работает на новом потоке)

public void invokeRequest(String entryPoint,String body,final OnWebApiResponseArrived callback){ 
     GameApiRequest request = new GameApiRequest(); 
     request.setEntryPoint(entryPoint); 
     request.setBody(body); 

     request.setUIResponseHandler(new Handler(){ 
      @Override 
      public void handleMessage(Message msg) { 

        if(msg.obj != null){ 
         if(msg.what == MCStatics.ResponseMessageCode) 
          callback.OnSuccess(msg.obj); 
         else 
          callback.OnFail("please,try again later."); 

        } 
       } 

      } 
     }); 

     Thread thread = new Thread(request); 
     thread.start(); 
    } 

ответ

0

Я решил проблему с помощью countdownlatch,

private final CountDownLatch responseLatch = new CountDownLatch (1); 

MRURLProtocol.mapDomain("gamification.fs", new MRProtocolResponseHandler() { 
      @Override 
      public InputStream handle(Uri uri) { 
      InputStream stream = null; 
       myApplication.getChamp().getImpulser().invokeRequest(method, body,new OnWebApiResponseArrived() { 
        @Override 
        public void OnSuccess(Object obj) { 
         String configString = "(function() { if (typeof(window) === 'undefined') ..... %s ...."; 
         configString = String.format(configString, obj); 
         stream = new ByteArrayInputStream(configString.getBytes()); 

         responseLatch.countDown(); 
        } 

        @Override 
        public void OnFail(String errMsg) { 
         String configString = "(function() { if (typeof(window) === 'undefined')..... %s ...."; 
         configString = String.format(configString, errMsg); 
         stream = new ByteArrayInputStream(configString.getBytes()); 

         responseLatch.countDown(); 
        } 
       }); 

       try { 
        responseLatch.await(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 

       return stream; 
      } 
     }); 
Смежные вопросы