2014-09-12 5 views
0

Я использую reddit API и пытаюсь загрузить дерево комментариев в потоке. Моя проблема в том, что я использую рекурсивную функцию для этого. Я создаю представление, а затем добавляю его программно. И он работает для небольших потоков, но когда ему приходится загружать большое дерево комментариев, я получаю stackoverflow.So мой главный вопрос: что такое хороший способ загрузить вложенные комментарии программно и что лучше всего подходит для переполнения стека? Я обсуждал добавление счетчика для добавленных комментариев, и когда они превышают некоторое число, я мог бы сломать цикл, но это все еще не гарантирует мне бесплатную программу «stackoverflow». Вообще говоря, как я могу отслеживать стек и кучу? Также в качестве последующего вопроса: мой динамический вид уничтожается при вращении, и я каждый раз его воссоздаю. Проблема с воссозданием медленная и замедляет вращение. Так что есть простой способ сохранить/сохранить представление при повороте и добавить его снова (setRetainInstance (true) не влияет на динамический вид, как раз на основной макет).Рекурсивная функция и деревья комментариев

private void addTextTree(JSONObject j, LinearLayout layoutparent) throws JSONException { 
    JSONObject j2 = j.getJSONObject("data"); 
    JSONArray j3 = j2.getJSONArray("children"); 
    LinearLayout currentparent = layoutparent; 
    Log.d("ADDINGVIEW", j3.length() + ""); 
    for (int i = 0; i < j3.length(); i++) { 
     JSONObject j4 = j3.getJSONObject(i); 
     JSONObject j5 = j4.getJSONObject("data"); 
     addComment(j5, currentparent); 
    } 
} 

private void addComment(JSONObject j, LinearLayout parent) throws JSONException { 
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
    LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 

    LinearLayout LLHmain = new LinearLayout(getActivity()); 
    LinearLayout LLVsecond = new LinearLayout(getActivity()); 

    LLHmain.setOrientation(LinearLayout.HORIZONTAL); 
    LLHmain.setLayoutParams(lp); 
    LLVsecond.setOrientation(LinearLayout.VERTICAL); 
    LLVsecond.setLayoutParams(lp1); 

    TextView author = new TextView(getActivity()); 
    TextView content = new TextView(getActivity()); 

    ImageView bar = new ImageView(getActivity()); 
    bar.setBackgroundResource(R.drawable.lines); 
    LLHmain.addView(bar, lp1); 

    author.setText(" " + j.optString("author") + " " + j.optInt("score") + " points"); 
    author.setBackgroundResource(R.drawable.border); 
    String temp = j.optString("body_html"); 
    String temp1 = Html.fromHtml(temp.substring(22, temp.length() - 12)).toString(); 
    content.setText(Html.fromHtml(temp1)); 
    content.setAutoLinkMask(Linkify.WEB_URLS); 
    content.setMovementMethod(LinkMovementMethod.getInstance()); 
    LLVsecond.addView(author, lp); 
    LLVsecond.addView(content, lp); 
    LLHmain.addView(LLVsecond, lp1); 
    parent.addView(LLHmain, lp); 
    if (!j.optString("replies").equals("")) { 
     JSONObject replies = j.getJSONObject("replies"); 
     addTextTree(replies, LLVsecond); 
    } 
} 

Подвела:

  1. Что такое лучший способ справиться с загрузкой деревьев TextViews и предотвращает переполнение стека.
  2. Отслеживание стека и кучи
  3. Сохранение динамического представления о вращении

Отказ от ответственности: Я новичок в какой-либо программирования и ни в коем случае я считаю, что это лучший или единственный способ сделай это. Я открыт для любых возможных решений, касающихся моей проблемы.

ответ

0

Я дам очень короткий вариант ответа (потому что я любопытное занят на работе), но следовать ему, что вы получите то, что вы хотите:

Вопрос заключается в том, что View являются памяти тяжелые объекты и не должны выделять их. Что вы делаете, чтобы избежать этого, используйте ListView, который может перерабатывать представления.

Так вместо того, чтобы рекурсивно создавать и добавлять взгляды вы создать класс данных, например:

public class DataItem{ 
    String author; 
    String content; 
} 

тогда вы строите ArrayList<DataItem> и рекурсивно добавить все элементы в этом массиве. Затем вы используете этот массив в adapter в listview.

Таким образом, вы можете иметь поток с тысячами элементов без проблем.

+0

Ваше предложение выглядит как [этот очень дерьмовый рисунок] (http://i.imgur.com/OHckIxf.png?1?2602)? Я использовал listfragment/listview, но не было никакой вложенности, поэтому я не совсем уверен, как обернуть вокруг себя голову. Является ли картина похожей на то, что вы имеете в виду? – user3542472

Смежные вопросы