由于数组下有巨大的对象,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出错了为啥的主要内容,如果未能解决你的问题,请参考以下文章
从一个巨大的(> 200MB)数组文件中加载随机对象而不加载整个数组