Как правильно выводить/менять данные (images) в activity

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
Тимур
Сообщения: 2
Зарегистрирован: 25 мар 2015, 11:33

Как правильно выводить/менять данные (images) в activity

Сообщение Тимур » 25 мар 2015, 14:18

Всем привет!

Есть приложение, в котором есть 7 кнопок (неделя1, неделя2 ..). При нажатии на каждую из них, загружается единая для всех кнопок активити, выводящая несколько связанных между собой картинок.

В первый раз я делал очень длинную картинку, так вот, андройду это не понравилось и он такуе не отображал (если только она не была меньше ~1000px по [вроде] по высоте). После этого я разбил картинку на более мелкие (по высоте) и все стало ок. Но когда таких картинок много (13-ую связанную картинку, андройд уже не может переварить) в одной активити, приложение аварийно завершается.

Алгоритм работы:
При нажатии на кнопку, загружается единая для всех кнопок активити, в ней первым делом находится linearLayout из main.xml (в файле layout обернут вьюхой scrollView).

Код: Выделить всё

    <ScrollView
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:fadeScrollbars="false"
        android:id="@+id/scrollInfo">

        <!--android:scaleType="fitXY"-->

        <LinearLayout
            android:id="@+id/layoutImages"
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        </LinearLayout>

    </ScrollView>

Определяется какая кнопка была нажата и в зависимости от ее id, из файла array.xml загружается массив, содержащий список файлов.

Код: Выделить всё

    
<string-array name="week1">
        <item>week1_1</item>
        <item>week1_2</item>
.....
</string-array>
<string-array name="week2">
        <item>week2_1</item>
        <item>week2_2</item>
......
</string-array>
Эти файлы в цикле перебираются и цепляются в layout-ту

Код: Выделить всё

            for (int cnt = 0; cnt < weekArr.length; cnt++) {
                imgView = new ImageView(this);
                resId = getResources().getIdentifier(weekArr[cnt], "drawable", getPackageName());

                imgView.setImageResource(resId);
                imgView.setAdjustViewBounds(true);

                imgView.setScaleType(ImageView.ScaleType.FIT_XY);
                imgView.setMaxWidth(R.dimen.max_width);

                layoutImages.addView(imgView, lParams);
            }
Плюс, в самом низу создаются 2 кнопки, при нажатии на которые юзер перемещается к меньшей или больше недели. Это происходит в той же активити.
При нажатии на эти кнопки, приложение вываливается, когда переходишь к недели, у которой подгружается более 12 связанных картинок.

Вопрос, из-за чего это может происходить? Пока мне видится что это из-за слишком большого кол-ва картинок, может не хватает памяти .....
Как это можно отследить? (try - catch молчит)

Help!

P.S. Программирование под Андройд начал осваивать 3 недели назад.

Тимур
Сообщения: 2
Зарегистрирован: 25 мар 2015, 11:33

Re: Как правильно выводить/менять данные (images) в activity

Сообщение Тимур » 27 мар 2015, 23:15

Проблемы я выявил .. Не очищается память выделенная под картинки. И тут странность:
если я пытаюсь удалить картинки в том-же самом методе где я их и создал, то они без проблем удаляются (память освобождается), а если я их пытаюсь удалить в методе onclick (который срабатывает при нажатии на кнопку, которая подгружает другие картинки), то они не удаляются (память не освобождается) ...

[syntax=java]
public class ViewData extends ActionBarActivity {
ArrayList<ImageView> pics;
LinearLayout layoutImages;
LinearLayout.LayoutParams lParams;

....

protected void onCreate(Bundle savedInstanceState) {
...
setContentView(R.layout.view);
...
layoutImages = (LinearLayout) findViewById(R.id.layoutImages);
lParams = new LinearLayout.LayoutParams( ... )
...
pics = new ArrayList<ImageView>();
showPage();
}

private void showPage(){
resId = getResources().getIdentifier("week" + weekId, "array", getPackageName());
String[] weekArr = getResources().getStringArray(resId);

for (int cnt = 0; cnt < weekArr.length; cnt++) {
pics.add(new ImageView(this));
resId = getResources().getIdentifier(weekArr[cnt], "drawable", getPackageName());
pics.get(cnt).setImageResource(resId);
layoutImages.addView(pics.get(cnt), lParams);
}

// Если вот тут очищать картинки с помощью метода .setImageDrawable(null) - то все ок!

}

// А вот вот в это методе, очистка не проходит(. Хотя в ArraList лежат ссылки на картинки ...
public void onclick(View v){
switch(v.getId()){
case R.id.btnPrev:
...
break;

case R.id.btnNext:
...
break;

}
...
layoutImages.removeAllViewsInLayout();

for (ImageView pic : pics) {
pic.setImageDrawable(null);
}

pics.clear();

showPage();

}

}
[/syntax]

WTF?!?
Почему не происходит очистка памяти?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Как правильно выводить/менять данные (images) в activity

Сообщение doter.ua » 28 мар 2015, 11:59

Picasso
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Ответить