以下是我正在尝试执行的操作:从远程服务器获取JSON数组并在列表视图中呈现它(在新活动中)当从弹出框中的项目列表中选择项目时。弹出窗口是在点击/点击活动中的某个元素时创建的。更具体地说:一项活动显示网格视图中的类别列表。每个类别都有一些子类别,当用户点击某个类别时,它们会显示为弹出式菜单中的项目列表。当用户选择弹出式菜单中的一个项目时,会创建一个新的活动,显示该子类别中的项目列表。项目详细信息作为JSON数组从远程服务器获取。 我已经创建了一个AsyncTask从弹出窗口中选择子类别时从服务器获取项目详细信息。以下是此代码段。当从嵌套事件侦听器执行AsyncTask时,onPostExecute()未被调用
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;
}
}
所述片段是用于显示在网格布局中的类别列表的活动的一部分。
而且,这里是从服务器获取JSONArray的AsyncTask。
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()函数完成其执行,没有任何例外。我怀疑这与嵌套事件侦听器有关,因为如果我从类别侦听器(即在onItemClick()中调用嵌套子类别侦听器setOnMenuItemClickListener())的函数启动Async任务,它工作得很好。
在此先感谢您的回答。我试图在我的问题中描述。如果需要,我会很乐意提供更多细节。
您是否正在从主(UI)线程执行asynctask?否则onPostExecute将不会被调用。 –
这里是导航流程:启动屏幕 - >类别屏幕(实现水平分页 - 创建并为每个选项卡分配一个片段) - >片段:onCreateView - > mGrid.setOnItemClickListener:onItemClick() - > popup.setOnMenuItemClickListener:onMenuItemClick() - >(new GetProductDataFromServer_Task()。execute(productURL);)。我的理解是,导致创建AsyncTask的所有活动都发生在UI线程上。如果我错了,请纠正我。 –
更新...当我在AsynTask的开始和使用AsyncTask从远程服务器获取的数据的开始之间引入大约2秒的延迟时,我没有看到之前报告的问题。我从这种行为推断出,网络延迟在防止Android框架调用onPostExecute()方面发挥了一定的作用。我打算处理这个问题的方式是显示一条“加载...”消息,直到我收到所有数据,然后开始新的活动。如果有人能提出更好的解决方案,我将不胜感激。谢谢 –