Вот что я пытаюсь сделать: получить массив 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()).
Заранее благодарим за ваш ответ. Я попытался описать в своем вопросе. Я буду рад предоставить более подробную информацию, если потребуется.
Вы выполняете асинтаску из основной (UI) темы? иначе onPostExecute не будет вызван. –
Вот поток навигации: Экран запуска -> Экран категории (реализует горизонтальный пейджинг - создает и присваивает один фрагмент за вкладку) -> Фрагмент: onCreateView -> mGrid.setOnItemClickListener: onItemClick() -> popup.setOnMenuItemClickListener: onMenuItemClick() - > (новый GetProductDataFromServer_Task(). execute (productURL);). Я понимаю, что все действия, ведущие к созданию AsyncTask, происходят в потоке пользовательского интерфейса. Пожалуйста, поправьте меня, если я ошибаюсь. –
Обновление ... Я не вижу проблемы, о которой сообщалось ранее, когда я представляю задержку около 2 секунд между запуском AsynTask и началом Activity, которая использует данные, извлекаемые AsyncTask с удаленного сервера. То, что я делаю из этого поведения, заключается в том, что задержка сети играет определенную роль в предотвращении использования Android-инфраструктуры onPostExecute(). То, как я планирую иметь дело с этим, - это показать сообщение «загрузка ...» до момента получения всех данных, а затем начать новое действие. Буду признателен, если кто-то может предложить лучшее решение. благодаря –