2012-06-15 2 views
0

Хорошо. Вот моя проблема.Android FQL Call Возвращение пустым после успешных вызовов [Изменено название]

Я делаю запрос FQL, и я сохраняю данные ответа. Мой код работает нормально, за исключением примерно через 4 минуты работы приложения. Я получаю исключение JSONException. Исключение читает

A JSONArray text must start with '[' at character 0 of 

что странно, потому что если я типа в URL запроса делает в браузере я получаю следующее

[{"uid":SOMENUMBER},{"uid":SOMENUMBER}] 

Который явно начинается с «[» характер.

Вот просьбой об

  String query = "SELECT uid FROM user WHERE is_app_user=1 and uid IN (SELECT uid2 FROM friend WHERE uid1 =" + fbId + ")"; 
     Bundle params = new Bundle(); 
     params.putString("method", "fql.query"); 
     params.putString("query", query); 
     mAsyncFacebookRunner.request(null, params, new FQLRequestListener()); 

Вот RequestListener

private class FQLRequestListener implements RequestListener 
    { 

     @Override 
     public void onComplete(String response, Object state) 
     { 
      try { 
       JSONArray json = new JSONArray(response); 
       friendsIds = new ArrayList<String>(); 
       for(int i = 0; i < json.length(); ++i) 
       { 
         String uid = json.getJSONObject(i).getString("uid"); 
         friendsIds.add(uid); 
         Log.d("friends", friendsIds.get(i)); 
       } 
       InviteFriends.this.runOnUiThread(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
          setUpList(); 
        } 
       }); 

      } catch (JSONException e) { 
       e.printStackTrace(); 

      } 
     } 

и стек ..

06-15 16:43:21.744: D/Facebook-Util(866): GET URL: THIS IS THE URL THAT WORKS IN A BROSWER (actual URL removed) 
06-15 16:43:21.774: W/System.err(866): org.json.JSONException: A JSONArray text must start with '[' at character 0 of 
06-15 16:43:21.774: W/System.err(866): at org.json.JSONTokener.syntaxError(JSONTokener.java:448) 
06-15 16:43:21.774: W/System.err(866): at org.json.JSONArray.<init>(JSONArray.java:104) 
06-15 16:43:21.774: W/System.err(866):  at org.json.JSONArray.<init>(JSONArray.java:150) 
06-15 16:43:21.774: W/System.err(866):  at rageup.android.InviteFriends$FQLRequestListener.onComplete(InviteFriends.java:129) 
06-15 16:43:21.774: W/System.err(866):  at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254) 

Я хотел бы отметить, что ..

  1. Query работает, когда я выхожу из системы и заходим в систему.

  2. Я гарантировал, что мой сеанс Facebook действителен.

  3. Приведенный в Facebook пример «Hackbook» имеет ту же проблему при загрузке списка друзей.

Поток Получение за исключением

  1. Главная страница Где Бревна пользователя В

  2. пользователь нажимает кнопку, чтобы начать второе действие

  3. Вторая активность является Где запрос сделан

  4. возвращение домой

  5. Повторите примерно через 4 минуты минус Войти

+0

Если вы не публикуете свой код и не видите трассировку стека, невозможно увидеть, что происходит. – Christine

+0

Просто уточнить: Вы говорите, что когда вы начинаете свое приложение, вы входите в FB, и он работает. Затем, если вы запустите указанный выше код за 4 минуты, он будет работать, и если вы запустите его через 4 минуты, это не так? –

+0

Да Вы правы –

ответ

1

Первая попытка проверить реакцию. Я хотел бы использовать:

JSONObject json = new JSONObject(response); 

Это дает вам возможность проверить содержимое объекта JSON, используя его методы. Вы не можете предположить, что facebook api всегда будет отвечать ожидаемой форме данных. Вы можете сделать:

Log.w("FacebookListener", "Unexpected response: " + response); 

А затем проверьте выход LogCat.

OK.Я не проверял еще, но в соответствии с: http://developers.facebook.com/docs/reference/rest/fql.query/ путь график FQL запросов является «FQL»

В mAsyncFacebookRunner.request(null, params, new FQLRequestListener()); вы передаете нуль, но «FQL», вероятно, ожидается

EDIT У меня есть проверил его на графическом проводнике - он работает, когда «запрос» заменяется простым «q». Убедитесь, вы идентифицируются в вашем приложении (Single Sign On, или диалог OAuth)

Bundle params = new Bundle(); 
params.putString("q", query); 
mAsyncFacebookRunner.request("fql", params, new FQLRequestListener()); 

Другой EDIT: Во время работы над другим проектом, я заметил, что там могут быть проблемы с Facebook Метод класса Util «read» - иногда (даже если InputStream имел данные) BufferedReader возвращал null и прерывал цикл. Я изменил тело метода на:

private static String read(InputStream in) throws IOException { 
    StringBuffer sb = new StringBuffer(); 
    final InputStreamReader rd = new InputStreamReader(in); 
    try { 
     final char[] buffer = new char[1024]; 
     int read; 
     while((read = rd.read(buffer)) != -1){ 
      sb.append(buffer, 0, read); 
     } 
    } catch (Exception e) { 

    } finally { 
     try { 
      rd.close(); 
     } catch (Exception e2) { 

     } 
    } 
    return sb.toString(); 
} 

и он работал.

+0

Ответ пуст, любая идея, почему это может быть? –

+0

Я обновил свой ответ.Вероятно, параметр «method» для Bundle также избыточен. –

+0

Это не сработало, я получил сообщение об ошибке. –

1

У меня такая же проблема: , вызывающий fql (простой вызов fql, а не asyncfqlrunner) У меня нет проблем вообще. Если бы я подождать несколько минут (2-4) и повторите попытку отправки запроса FQL, я получаю исключение, в facebook андроид API:

A JSONObject text must begin with '{' at character 0 of

Я также гарантировал, что фб сессия действует унд запрос верный. ничего не изменилось, кроме времени исключения.

Я пробовал утвердить, чтобы переписать метод , но ошибка все еще происходит.

EDIT Поскольку даже facebook не знает об этой проблеме, и никто еще не писал ничего об этом я понял это сам. При использовании нормального запроса-метод (а не один асинхронной), перейти к Facebook.java в FB-API и изменить следующую строку в соответствии с public String request(Bundle parameters):

ОТ:

return request(null, parameters, "GET"); 

К

return request(null, parameters, "POST"); 

и все должно работать нормально!

+0

Отличная находка для использования Async, следует ли менять «GET» на «POST»? –

+0

На самом деле я не пробовал это с помощью Asyncs. Я предпочитаю использовать свои собственные задачи Async вместо использования Facebook. Вы можете попробовать и опубликовать результат, но –

+0

Я попытался использовать это, но я получил те же результаты с Asyncs. –

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