2013-05-28 2 views
3

Я здесь с другим вопросом. Я отправляю вам код из моей функции AsyncTask для получения значений из JSONObject (webservice). Моя проблема заключается в том, что у меня есть список, и я заполняю этот список данными из json в методе onSuccess, но позже, в методе onPostExecute для AsyncTask, «result» имеет значение null.AsyncTask и JSON, onSuccess ничего не возвращает

private class getCategories extends AsyncTask<String, Void, List<Category>> { 

     private int num_cat_subcat; // category count 

     @Override 
     protected List<Category> doInBackground(String... arg0) { 
      AsyncHttpClient client = new AsyncHttpClient(); 
      client.get(arg0[0], null, new JsonHttpResponseHandler() { 

       public void onSuccess(JSONObject data) { 
        try { 
         JSONObject response = data.getJSONObject("response"); 
         JSONArray categories = response 
           .getJSONArray("categories"); 

         // elements count 
         num_cat_subcat = categories.length(); 

         for (int i = 0; i < categories.length(); i++) { 
          JSONObject item = (JSONObject) categories 
            .getJSONObject(i); 

          if (item.getString("id").equalsIgnoreCase(
            "4d4b7105d754a06376d81259")) { 
           JSONArray subcategories = item 
             .getJSONArray("categories"); 

           // Category --> id, name, pluralName, shortName, 
           // icon_prefix, icon_suffix, primary, parentId 
           Category newItem = new Category(item 
             .getString("id"), item 
             .getString("name"), item 
             .getString("pluralName"), item 
             .getString("shortName"), null, null, 
             null); 
           listCategories.add(newItem); 
           newItem = null; 

           if (subcategories.length() > 0) { 
            // Si tiene subcategorias las contamos. 
            num_cat_subcat += subcategories.length(); 

            for (int j = 0; j < subcategories.length(); j++) { 
             JSONObject subitem = (JSONObject) subcategories 
               .getJSONObject(j); 

             Category newSubItem = new Category(
               subitem.getString("id"), 
               subitem.getString("name"), 
               subitem.getString("pluralName"), 
               subitem.getString("shortName"), 
               null, null, item 
                 .getString("id")); 
             listCategories.add(newSubItem); 
             newSubItem = null; 
            } 
           } 
          } 
         } 
        } catch (JSONException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 

       public void onFailure(Throwable arg0) { 

       } 
      }); 
      return listCategories; 
     } 

     @Override 
     protected void onPostExecute(List<Category> result) { 
      Log.i("result", result.toString()); 

      for (int k = 0; k < result.size(); k++) { 
       ALLOFTHEM += result.get(k).getId(); 
       if (k < result.size() - 1) { 
        ALLOFTHEM += ","; 
       } 
      } 

     } 

    } 
+0

вы видите данные, которые вы хотите на ур 'ListView'.DOes ваш отладочный монитор принять вас в' onPostExecute' – Nezam

+0

будет там напечатано любое исключение? –

+0

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

ответ

2

onPostExecuted вызывается, когда doInBackground закончится его исполнение. Если метод прибудет в AsyncHttpClient не метод блокировки, onPostExecuted вызываются до onSuccess разбирает результат

+0

, почему это ответ, а не комментарий? – Nezam

+4

Зачем это комментарий? – Blackbelt

0

onPostExecuted вызывается перед OnSuccess разбирает результат, поэтому попробуйте отображение что-то в цикле или отладить этот код.

Log.e("Test", item.getString("id"));//inside for Loop 

, а также использовать это, прежде чем ваш цикл

listCategories = new List<Category>(); 

надеется, что это поможет.

+0

Он показывает мне журнал logcat, когда вы вводите onPostExecute. Но внутри onSuccess listCategories есть данные, а снаружи, на результат onPostExecute он отображается как [] в logcat – MAOL

3

, если вы используете loopj android-async-http то нет необходимости использовать AsyncTask для получения данных с сервера doInBackground и обновление пользовательского интерфейса в onPostExecute потому onSuccess метод всегда выполняются на UI Thread после фонового вычисления. просто сделать это без AsyncTask как:

AsyncHttpClient client = new AsyncHttpClient(); 
client.get("Pass Url Here", null, new JsonHttpResponseHandler() { 
    @Override 
    public void onSuccess(JSONObject data) { 
      // update your ListView here 
     } 
    @Override 
    public void onFailure(Throwable arg0, JSONObject arg1) { 
     // TODO Auto-generated method stub 

     super.onFailure(arg0, arg1); 

    } 
    }); 
+0

Спасибо, я не знаю, что – MAOL

+0

У меня такая же проблема! im делает асинхронный вход через AsyncTask с использованием метода ρяσѕρєя K, но его не работает, а im получает исключение nullPointerException. если я делаю логин в основном потоке, он отлично работает. Зачем? Я использую библиотеку loopj! – Pheonix7

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