由于数组下有巨大的对象,android json出错了为啥

Posted

技术标签:

【中文标题】由于数组下有巨大的对象,android json出错了为啥【英文标题】:android json getting error due to have huge objects under array why由于数组下有巨大的对象,android json出错了为什么 【发布时间】:2016-05-15 00:02:27 【问题描述】:

我在 JSON 数组中有大量 10,000 个对象:

如何获取所有记录?我收到内存不足错误,应用程序已关闭。 我可以通过分组来做到这一点吗? 内存不足错误.. 像这样的错误 Throwing OutOfMemoryError "在 OOM 之前无法分配 86 字节的 66 字节和 66B 分配

-WaitForGcToComplete 阻塞 50.483 毫秒,原因是 Alloc I/art:将目标 GC 堆从 33MB 钳制到 32MB

这是我的画廊图像代码..为什么这没有显示完整的窗口

公共类 Act_PhotoGallery 扩展 Act_Main

public static Act_PhotoGallery act_gallery;
GridView lv;

ImageView img_tab2,imv_logout;

RelativeLayout rel_tab2;
LinearLayout slidingPanel;
TextView menu1,menu2,menu3,txt_log_name;
ImageView imvslide,imv_log_pic;
String log_name,log_pic,log_id;
URL url;
Bitmap image;

public void setBackApiResponse(int requestcode, Object obj1) 

    if (requestcode == ConstantValue.REQUESTCODE_VIEWGALLERY_LIST)
        setData(obj1);



private void setData(Object obj1) 

    @SuppressWarnings("unchecked")
    TeamAdapter TeamAdapter = new TeamAdapter(this,(ArrayList<View_Gallery>) obj1);
    lv.setAdapter(TeamAdapter);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
            View_Gallery v=new View_Gallery();

        
    );



@Override
protected void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.gridview);
    SharedPreferences preferences = PreferenceManager
            .getDefaultSharedPreferences(this);

    log_name = preferences.getString("name", "");
    log_pic = preferences.getString("log_pic", "");
    log_id = preferences.getString("log_id", "");
    findIdsfromXML();
    initialize();
    String uri = getRequestUrl();
    if (uri != null) 
        HttpHelper httpHelper = new HttpHelper(
                ConstantValue.REQUESTCODE_VIEWGALLERY_LIST, Act_PhotoGallery.this,
                "Loading...");
        httpHelper.execute(uri);
    

private void findIdfromBottomXml()

    img_tab2=(ImageView) findViewById(R.id.bottombar_tab2_img_gallery);

    rel_tab2=(RelativeLayout) findViewById(R.id.bottambar_rel_tab2);
  //  imv_logout=(ImageView)findViewById(R.id.imv_logout);


private void findIdsfromXML() 

    lv = (GridView) findViewById(R.id.grid);
    slidingPanel=(LinearLayout)findViewById(R.id.slidingPanel);
    menu1=(TextView)findViewById(R.id.menu_item_1);
    menu2=(TextView)findViewById(R.id.menu_item_2);
    menu3=(TextView)findViewById(R.id.menu_item_3);
    imvslide=(ImageView)findViewById(R.id.imv_slide);
    slidingPanelParameters = (FrameLayout.LayoutParams) slidingPanel.getLayoutParams();
    slidingPanelParameters.width = metrics.widthPixels;
    slidingPanel.setLayoutParams(slidingPanelParameters);

    txt_log_name=(TextView)findViewById(R.id.menu_title_1);
    imv_log_pic=(ImageView)findViewById(R.id.imv_prof);
    String img = ConstantValue.URL_profile_photo +log_id+"/"+log_pic;
    //


    //
    if(!log_pic.equalsIgnoreCase("null")) 
        ImageLoader imageLoader=new ImageLoader(this);
        //String img = ConstantValue.URL_profile_photo + log_id + "/" + log_pic;

        imageLoader.DisplayImage(img, null, imv_log_pic,
                60, false);
    
    txt_log_name.setText(log_name);

    findIdfromBottomXml();
    setImagesSelectedBottom(2, rel_tab2, img_tab2);




private void initialize() 
    act_gallery = Act_PhotoGallery.this;



private String getRequestUrl() 
    String request = null;

    request = String.format(ConstantValue.URL_VIEW_GALLERY_POST);
    Log.e("Url team", request);
    return request;


private class TeamAdapter extends BaseAdapter 

    private LayoutInflater mInflater;
    ArrayList<View_Gallery> team_arrylist = new ArrayList<View_Gallery>();

    private int imgeSize = 75;
    ImageLoader imageLoader = new ImageLoader(Act_PhotoGallery.this);

    public TeamAdapter(Context context, ArrayList<View_Gallery> obj1) 
        mInflater = LayoutInflater.from(context);
        this.team_arrylist = obj1;

    

    @Override
    public int getCount() 
        return team_arrylist.size();
    

    @Override
    public Object getItem(int position) 
        return position;
    

    @Override
    public long getItemId(int position) 
        return position;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        final ViewHolder holder;

        // final View_ClubList v_club= club_arrylist.get(position);

        if (convertView == null) 
            convertView = mInflater.inflate(R.layout.grid_item, null);
            holder = new ViewHolder();



            holder.imgg = (ImageView) convertView
                    .findViewById(R.id.grid_image);

            convertView.setTag(holder);
         else 
            holder = (ViewHolder) convertView.getTag();
        

//发现问题

        String img = ConstantValue.URL_GALLERY_IMAGE + team_arrylist.get(position).meta_value;
        if(!team_arrylist.get(position).meta_value.equalsIgnoreCase("null")) 
            imageLoader.DisplayImage(img, null, holder.imgg, imgeSize, false);
        


        return convertView;
    

    private class ViewHolder 
        TextView text_teamname;
        TextView text_teamemail;
        ImageView imgg;
    

public void onSlideClick(View v) 
    switch (v.getId()) 
        case R.id.imv_slide:
            slideclick(slidingPanel);
            break;
    

【问题讨论】:

创建一组对象。其他明智的使用分页 好的thanx m正在尝试.. 我收到此错误。LOS 对象,0% 空闲,31MB/32MB,暂停 1.251 毫秒,总共 61.364 毫秒 WaitForGcToComplete 因背景原因被阻止 54.769 毫秒 使用延迟加载机制加载页面或10、20、..对象组中的数据 在延迟加载期间我需要点击每个页面的 url在这种情况下? 【参考方案1】:

请在单独的 Asynctask 中解析 jsonArray 中的所有对象。

【讨论】:

thanx Ryan .i 已经为所有人使用了单个 AsyncTask。现在它可以正常工作,但由于 json 数据量大而需要加载时间 @chandeshwar,第一个 asynctask 用于进行 web 服务调用并在第一个 asynctask 的 onPostExecute() 方法中获取 jsonArray,然后启动第二个 asynctask,从第一个 asynctask 的 onPostExecute() 方法传递 jsonarray 并使用 gson 进行 json 解析然后让我知道加载时间是否减少。 不错的想法...我只是尝试这种方式..thanx 兄弟...只是尝试..更新我会告诉你确定 兄弟..我问你的另一个问题..我的画廊图像显示在网格视图中..但是当我点击任何图像时..图像没有以窗口大小显示为什么?在同一帧@ryan @chandeshwar.. 将不得不看看你的代码伙伴【参考方案2】:

JSON 用于轻量数据传输的数据交换,如果您尝试传递太多数据,您将耗尽内存并且网络调用将不得不进行大量内存管理,

您可能认为通过请求更多堆 (android:largeHeap="true") 可能会解决问题,但事实并非如此,

您可以做的是,请求您在给定时间可以处理的JSON 数据量,并附上metadata,这将跟踪您获得的数据以及您将来会请求什么。

例子:-


  "data": [
    
      "infotmation": "something to be"
    ,
    
      "infotmation": "3 AM"
    ,
    
      "infotmation": "something to be"
    ,
    
      "infotmation": "3 AM"
    
  ],
  "metaData": 
    "currentPage": 1,
    "nextPage": 2
  

【讨论】:

【参考方案3】:

我已经为大尺寸的 json 对象回答了这个问题。 请检查我的回答

How to deal with a large JSON object on Android

【讨论】:

以上是关于由于数组下有巨大的对象,android json出错了为啥的主要内容,如果未能解决你的问题,请参考以下文章

Android- 创建 JSON 数组和 JSON 对象

将巨大的(95Mb)JSON 数组拆分成更小的块?

从一个巨大的(> 200MB)数组文件中加载随机对象而不加载整个数组

在 JSON.Net 中处理不存在的 JSON 令牌如何返回默认值而不是抛出异常

c# json对象中含有数组,数组中又含有数组!

Json对象到android中的对象数组