2015-04-26 3 views
0

Вот что я пытаюсь сделать: получить массив JSON с удаленного сервера и отобразить его в виде списка (в новом действии) когда элемент выбран из списка элементов во всплывающем окне. Всплывающее окно создается, когда элемент в активности кликается/постукивается. Чтобы быть более конкретным: действие отображает список категорий в виде сетки. Каждая категория имеет кучу подкатегорий, которые отображаются в виде списка элементов во всплывающем окне, когда пользователь нажимает на категорию. Когда пользователь выбирает один из элементов во всплывающем окне, создается новое действие, которое отображает список элементов в этой подкатегории. Детали элемента извлекаются с удаленного сервера в виде массива JSON. Я создал AsyncTask для извлечения сведений о деталях с сервера, когда из всплывающего окна выбрана подкатегория. Ниже приведен фрагмент кода для этого.onPostExecute() не запускается, когда AsyncTask выполняется из вложенного прослушивателя событий

public class Section extends Fragment { 
    ... 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     ... 

     mGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView <? > parent, final View v, nt position, long id) { 
       ... 

       PopupMenu popup = new PopupMenu(getActivity(), v); 

       ... 

       popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
        public boolean onMenuItemClick(MenuItem item) { 
         new GetProductDataFromServer_Task().execute(productURL); 
         Intent intent = new Intent(getActivity(), ProductListScreen.class); 
         startActivity(intent); 

         return true; 
        } 
       }); 
      }); 
     } 

     return rootView; 
    } 
} 

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

И вот AsyncTask, который извлекает JSONArray с сервера.

private class GetProductDataFromServer_Task extends AsyncTask < String, Long, JSONObject > { 

    @Override 
    protected JSONObject doInBackground(String...params) { 
     HttpEntity httpEntity = null; 

     HttpGet httpGet = null; 
     try { 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      httpGet = new HttpGet(params[0]); 
      HttpResponse httpResponse = httpClient.execute(httpGet); 
      httpEntity = httpResponse.getEntity(); 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // Convert HttpEntity into JSON Array 
     JSONObject jsonObject = null; 

     if (httpEntity != null) { 
      try { 
       String entityResponse = EntityUtils.toString(httpEntity); 
       jsonObject = new JSONObject(entityResponse); 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (IllegalStateException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return jsonObject; 
    } 

    @Override 
    protected void onPostExecute(JSONObject jsonObject) { 
     try { 
      JSONArray products = jsonObject.getJSONArray("products"); 
      int numProducts = products.length(); 
      mProductList = new ProductInfoForGridView[numProducts]; 
      for (int prodIdx = 0; prodIdx < numProducts; prodIdx++) { 
       mProductList[prodIdx] = GetProductObjFromJSONObj(products.getJSONObject(prodIdx)); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Проблема, с которой я столкнулся, заключается в том, что onPostExecute() по какой-либо причине не вызван. JSONArray успешно извлекается с сервера, а функция doInBackground() завершает свое выполнение без каких-либо исключений. Я подозреваю, что это имеет какое-то отношение к вложенным прослушивателям событий, так как это работает очень хорошо, если я запускаю задачу Async из прослушивателя категорий (т. Е. В onItemClick() - функция, которая вызывает вложенные слушатели подкатегории, setOnMenuItemClickListener()).

Заранее благодарим за ваш ответ. Я попытался описать в своем вопросе. Я буду рад предоставить более подробную информацию, если потребуется.

+0

Вы выполняете асинтаску из основной (UI) темы? иначе onPostExecute не будет вызван. –

+0

Вот поток навигации: Экран запуска -> Экран категории (реализует горизонтальный пейджинг - создает и присваивает один фрагмент за вкладку) -> Фрагмент: onCreateView -> mGrid.setOnItemClickListener: onItemClick() -> popup.setOnMenuItemClickListener: onMenuItemClick() - > (новый GetProductDataFromServer_Task(). execute (productURL);). Я понимаю, что все действия, ведущие к созданию AsyncTask, происходят в потоке пользовательского интерфейса. Пожалуйста, поправьте меня, если я ошибаюсь. –

+0

Обновление ... Я не вижу проблемы, о которой сообщалось ранее, когда я представляю задержку около 2 секунд между запуском AsynTask и началом Activity, которая использует данные, извлекаемые AsyncTask с удаленного сервера. То, что я делаю из этого поведения, заключается в том, что задержка сети играет определенную роль в предотвращении использования Android-инфраструктуры onPostExecute(). То, как я планирую иметь дело с этим, - это показать сообщение «загрузка ...» до момента получения всех данных, а затем начать новое действие. Буду признателен, если кто-то может предложить лучшее решение. благодаря –

ответ

0

Вы уверены, onPostExecute не работает. Вы пробовали

yourGridAdapter.notifyDataSetChanged() в onPostExecute

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