Рекурсивная функция и деревья комментариев

Я использую 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. Каков наилучший способ обработки загрузки текстовых просмотров и предотвращения.
  2. Отслеживание стека и кучи
  3. Сохранение динамического представления при вращении

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

1 ответ

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

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

Поэтому вместо рекурсивного создания и добавления представлений вы создадите класс данных, например:

public class DataItem{
 String author;
 String content;
}

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

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

licensed under cc by-sa 3.0 with attribution.