2015-04-26 169 views
0

以下是我正在尝试执行的操作:从远程服务器获取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任务,它工作得很好。

在此先感谢您的回答。我试图在我的问题中描述。如果需要,我会很乐意提供更多细节。

+0

您是否正在从主(UI)线程执行asynctask?否则onPostExecute将不会被调用。 –

+0

这里是导航流程:启动屏幕 - >类别屏幕(实现水平分页 - 创建并为每个选项卡分配一个片段) - >片段:onCreateView - > mGrid.setOnItemClickListener:onItemClick() - > popup.setOnMenuItemClickListener:onMenuItemClick() - >(new GetProductDataFromServer_Task()。execute(productURL);)。我的理解是,导致创建AsyncTask的所有活动都发生在UI线程上。如果我错了,请纠正我。 –

+0

更新...当我在AsynTask的开始和使用AsyncTask从远程服务器获取的数据的开始之间引入大约2秒的延迟时,我没有看到之前报告的问题。我从这种行为推断出,网络延迟在防止Android框架调用onPostExecute()方面发挥了一定的作用。我打算处理这个问题的方式是显示一条“加载...”消息,直到我收到所有数据,然后开始新的活动。如果有人能提出更好的解决方案,我将不胜感激。谢谢 –

回答

0

您确定onPostExecute未运行。您是否尝试过

yourGridAdapter.notifyDataSetChanged() in onPostExecute

相关问题