0

IntentService 内で単純なクエリ(fql)を実行しています(ボタンのクリックで開始されます)。サービス クラスの onHandleIntent() メソッドは次のとおりです。

 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); 

}

問題は、(Request から始まる) 内部クラス内のコード セグメントが実行されないことです。上記のコードの場合、次の出力が得られます。

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

エラーが何なのかわかりません。ログでもエラーは表示されません。助けてください。

4

2 に答える 2

0

Request.executeBatchAndWait
(リクエスト); Request.executeBatchAsync(request); の代わりに

「Request.executeBatchAndWait(request)」はコールバックを必要としないため、問題を解決します。「Request.executeBatchAsync(request)」はリクエストの結果を別のスレッドで処理しますが、リクエストを受信して​​同じスレッドで処理します。そのため、結果を処理したり、プロセスが成功したか失敗したかを判断したりするために、コールバックが指定されています。

于 2013-07-27T21:19:00.727 に答える
0

タイプ Request の定義が表示されないため、見分けるのは困難ですが、IntentService でコールバックを予期しているため、問題が発生していると思われます。それはうまくいきません。IntentService は onHandleIntent() のすべてのコードが完了するまで実行され、その後破棄されます。何かがコールバックを作成しようとしても、インスタンスが見つからないため機能しません。

代わりに、開始されたサービスを使用する必要がある場合があります。

于 2013-07-26T23:10:16.670 に答える