0

Я выполняю простой запрос (fql) внутри IntentService (который начинается с нажатия кнопки). Вот мой метод onHandleIntent() класса обслуживания:Запрос внутри IntentService не выполняется.

protected void onHandleIntent(Intent intent) 
{ 
    Global appState = ((Global)getApplicationContext()); 
    System.out.println("inside the service now"); 
    String uid=appState.uid[0]; 
    System.out.println("uid ="+uid); 

    String fqlQuery = "SELECT uid, name, online_presence, status FROM user WHERE uid="+uid+" "; 
    Bundle params = new Bundle(); 
    params.putString("q", fqlQuery); 
    Session session = Session.getActiveSession(); 
    System.out.println(session); 
     Request request = new Request(session,         // starting of innerclass 
     "/fql",       
     params,       
     HttpMethod.GET,     
     new Request.Callback(){ 

     public void onCompleted(Response response) { 
       //Log.i(TAG, "Result: " +response.toString());      //response.toString() 
     GraphObject graphObject = response.getGraphObject(); 
      // String s = textViewResults.getText().toString(); 
      if (graphObject != null) { 
        JSONObject jsonObject = graphObject.getInnerJSONObject(); 
         try { 
         JSONArray array = jsonObject.getJSONArray("data"); 
          for (int j = 0; j < array.length(); j++) {      // always array.length()=1, loop will run jst 1 time 
          JSONObject object = (JSONObject) array.get(j); 
           System.out.println("inside inner class now"); 
           System.out.println("id = " +object.get("uid").toString()); 
           System.out.println("name = "+object.get("name").toString()); 
           System.out.println("op ="+object.get("online_presence").toString()+"niraj"); 
           name=object.get("name").toString(); 
          } 
       } catch (JSONException e) { 

        e.printStackTrace(); 
       } 
      }   // end of if block 


       } // end of onCompleted method     
     }); 

     // Thread.currentThread().sleep(10000);//sleep for 1000 ms 
    Request.executeBatchAsync(request); 


    System.out.println("outsise the inner class ____ name : "+name); 

} 

проблема заключается в том, что сегмент кода внутри внутреннего класса (начиная с запроса) не получает выполняется только. Для вышеуказанного кода я получаю следующий вывод:

07-26 17:21:09.105: I/System.out(1541): inside the service now 
07-26 17:21:09.105: I/System.out(1541): uid =100002621905500 
07-26 17:21:09.136: I/System.out(1541): {Session state:OPENED, token:{AccessToken  
token:ACCESS_TOKEN_REMOVED permissions:[user_likes, user_status,  
friends_online_presence, user_online_presence]}, appId:"my app id"} 
07-26 17:21:09.206: I/System.out(1541): outsise the inner class ____ name : null 

Я не понимаю, есть ли ошибка. даже журнал не показывает никаких ошибок .please help.

+0

Как я вижу, вы передаете строку только как параметр и ничего не делаете с ней, где она должна быть выполнена? – zozelfelfo

+0

, но тот же код, когда я запускаю в своем MainActivity, отлично работает @zozelfelfo – user1872750

ответ

0

Трудно сказать, потому что я не вижу определения типа Request, но у меня есть проблемы, потому что вы ожидаете обратного вызова в своем IntentService. Это не сработает. IntentService запускается до тех пор, пока весь код в onHandleIntent() не будет завершен, тогда он будет уничтожен. Если что-то пытается сделать обратный вызов, это не сработает, потому что он не может найти экземпляр.

Возможно, вам потребуется использовать начатую службу.

+0

Спасибо lottt @ Joe Malin !! Использование службы вместо IntentService. – user1872750

+0

просто из любопытства, не можем ли мы ждать (сна) внутри IntentService для обратного вызова. – user1872750

0


Request.executeBatchAndWait (request); на месте Request.executeBatchAsync (запрос);

решает проблему, так как «Request.executeBatchAndWait (запрос)» требует «обратного вызова», он получает запрос и обрабатывает его в одном потоке, в то время как «Request.executeBatchAsync (запрос)» обрабатывает результат запроса в другой поток, поэтому в порядке обработки результата или определения того, был ли обработан или не выполнен обратный вызов.

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