Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
#1

Загрузка и отображение большого количества картинок с памяти телефона - Программирование Android

10.04.2014, 15:37. Просмотров 2030. Ответов 17
Метки нет (Все метки)

Если изображения больше 10, то начинаются заметные тормоза, если больше 100, то программа падает с ошибкой памяти
у меня есть массив, содержащий абсолютные пути к нужным картинкам
по ним я вытаскиваю thumbnails и загружаю в imageView
каждая imageView обернута в разметки
обернута так(т.е. из кода создается такая размекта)
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<LinearLayout 
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:weightSum="1"  
            android:orientation="horizontal">
            <FrameLayout 
                android:layout_width="wrap_content"
                android:layout_weight="0.5"
                android:layout_margin="1dp"
                android:layout_height="wrap_content">
                <RelativeLayout 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    >
                    <ImageView 
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="@drawable/folder"/>
                </RelativeLayout>
            </FrameLayout>
            <FrameLayout 
                android:layout_width="wrap_content"
                android:layout_weight="0.5"
                android:layout_margin="1dp"
                android:layout_height="wrap_content">
                <RelativeLayout 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    >
                    <ImageView 
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:src="@drawable/folder"/>
                </RelativeLayout>
            </FrameLayout>
        </LinearLayout>
в цикле загружаются thumbnail`s таким образом
Java
1
2
3
4
5
6
7
8
9
cursor = parentA.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "='" + parentA.links[c] + "'", null, null);
                    if (cursor != null) {
                        if (cursor.getCount() > 0) {
                            cursor.moveToFirst();
                            Bitmap thB = MediaStore.Images.Thumbnails.getThumbnail(parentA.getContentResolver(), cursor.getInt(0), MediaStore.Images.Thumbnails.MINI_KIND, null);
                            e3.setImageBitmap(thB);
                        }
                        
                    }
e3 - imageView

подскажите, что вызывает такую задержку, обращения к памяти, или создание кучи разметок?
и как оптимизировать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2014, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Загрузка и отображение большого количества картинок с памяти телефона (Программирование Android):

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

Массив из большого количества кнопок - Программирование Android
Добрый день! Как понятно из названия, хочу создать массив из большого количества кнопок, 100 например. Нагуглила вот что: int...

OpenGL отрисовка большого количества точек - Программирование Android
Столкнулся с следующей проблемой. При отрисовке большого количества точек в приложении происходит ошибка, и при этом никакие логи не...

Программная расстановка большого количества кнопок - Программирование Android
Здравствуйте, переношу своё сетевое приложение на java &quot;Морской бой&quot; и столкнулся с небольшой проблемой, я совсем не понял, как можно...

Хранение и использование большого количества изображений - Программирование Android
Всем привет! Подскажите способ хранения большого количества изображений, чтобы можно было эти изображения удобно использовать. Смотрел...

Сохранение большого количества записей ключ-значение - Программирование Android
Люди, подскажите, пожалуйста, как мне сохранить в приложении большое количество записей ключ-значение? Ближе всего мне, конечно, SQLite, но...

17
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
10.04.2014, 16:25 #2
Задержку вызывает то, что у вас все картинки хранятся в оперативной памяти. И при большом количестве картинок ее просто не хватает и программа выдает OutOfMemoryException. Чтоб этого избежать вам нужно использовать ссылки SoftReference или WeakReference, что бы программа знала, что при необходимости эти объекты можно удалить при помощи сборщика мусора.
1
YuraAAA
1578 / 1319 / 271
Регистрация: 25.10.2009
Сообщений: 3,437
Записей в блоге: 2
10.04.2014, 17:20 #3
spydark91, и попробуйте загружать в отдельном потоке, отдавая в ответ Bitmap или Reference<Bitmap>
1
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
10.04.2014, 19:30  [ТС] #4
spydark91, и попробуйте загружать в отдельном потоке, отдавая в ответ Bitmap или Reference<Bitmap>
т.е. стоит делать так
шаг 1-
формируем массив из Reference<Bitmap>, вытаскивая в цикле картинки из памяти
шаг 2-
опять же в цикле выводим картинки из массива, сформированного выше, на экран
так?
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
10.04.2014, 19:38 #5
Шаг 3 http://nostra13android.blogspot.ru/2...er-part-1.html

В реализации просмотра миниатюр очень много подводных камней, рекомендую использовать готовы велосипед.

Вот еще почитайте http://developer.android.com/training/displaying-bitmaps/index.html
1
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
10.04.2014, 22:25  [ТС] #6
не хочу использовать сторонние либы, так что буду пробовать эти 2 шага)

Добавлено через 2 часа 24 минуты
запутался я..
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class photosScreen extends FragmentActivity {
    public String[] links; // тут абсолютные пути к картинкам
    public SoftReference<List<Bitmap>> btms = new SoftReference<List<Bitmap>>(null);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }   
 
    public class ImageAdapter extends BaseAdapter {
        private Context mContext;
        public ImageAdapter(Context c) {
            mContext = c;
        }
        public int getCount() {
            return btms.get().size();
        }
        public Object getItem(int position) {
            return btms.get().get(position);
        }
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) {
                imageView = new ImageView(mContext);
            } else {
                imageView = (ImageView) convertView;
            }
            btms.get().add() // тут надо выхывать asyncTask,который загрузит картинку из памяти?
            imageView.setImageBitmap(btms.get().get(position));
            
            return imageView;
        }
 
    }
}
подскажите правильно ли делаю и что делать дальше
адаптор для вывода в gridview
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 00:08 #7
Java
1
 imageView.setImageBitmap(btms.get().get(position));
У вас скорее всего вылетит с критом когда нибудь, т.к. таски не сразу выполняются и на момент установки поток может еще не завершить свою работу, а вы уже будете ставить картинку. В таком случае на место вашей подгружающейся картинки нужно ставить какую нибудь заглушку и когда картинка подгрузится в потоке нужно будет найти нужную вьюху и заменить заглушку на миниатюру. Так же неплохо было бы организовать какой нибудь кэш для картинок, чтоб при скролинге картинки каждый раз не подгружались. В этом вам поможет класс LruCache или LinkedHashMap, только опять же все это дело должно быть засинхронизировано иначе вы рискуете получить ошибку когда потоки начнут долбиться в одно место.
1
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
11.04.2014, 14:19  [ТС] #8
как узнать какие из вьюх в данный момент отображаются при скролинге? чтоб в них загружать?

Добавлено через 57 секунд
и если честно, то не понял смысл soft ссылок
ведь всеравно они ссылаются на объект до тех пор, пока этот объект не зачищен
а следовательно это объект все так же висит в памяти
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 14:36 #9
можно создать класс который будет содержать Bitmap, путь к картинку и какой нибудь идентификатор ImageView. А когда поток загрузит миниатюру искать по пути картинки нужный экземпляр класса и вытаскивать от туда вьюху. Но тут могут при быстром скролинге проблемы начаться.

На сколько я помню Soft удалит объекты только когда будет нехватка памяти, а weak при любом запуске сборщика мусора если конечно этот объект не используется.
0
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
11.04.2014, 15:07  [ТС] #10
На сколько я помню Soft удалит объекты только когда будет нехватка памяти, а weak при любом запуске сборщика мусора если конечно этот объект не используется.
это же самое я прочитал в статье и не понял в чем смысл
ссылка ссылается на экземпляр битмапа который всеравно загружается в память
ну например
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
SoftReferrence<Bitmap>[]  ref;
 
functionProcessingInBackground {
    Bitmap b = загрузили из памяти
    ref[refIndex] = new SoftReferrence(b);
    // при завершении выполнения это процедуры b удалится, но ссылка на картинку останется
}
 
showBitmapsOnScreen {
    for (int i = 0; i<ref.length;i++) {
        imageViewArray[i] = ref[i];
    }
}
верно привел смысл?

и еще вопрос:
повлияет ли на производительность то, что я буду использовать кучу лайотов вместо грида?

Добавлено через 5 минут
Цитата Сообщение от spydark91 Посмотреть сообщение
повлияет ли на производительность то, что я буду использовать кучу лайотов вместо грида?
это я к тому что не хочу с имагаАдаптером возиться
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 15:07 #11
b удалиться только тогда когда у вас будет OutOfMemory непосредственно перед ним.

Грид попроизводительнее будет.
1
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
11.04.2014, 20:06  [ТС] #12
Цитата Сообщение от KillAndEat Посмотреть сообщение
b удалиться только тогда когда у вас будет OutOfMemory непосредственно перед ним.
ну вот он удалится после того как я загружу 30 фотографию
и как быть потом?
как то это отлавливать и по новой загружать?
и как загружать по новой, если памяти нет уже
0
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 23:52 #13
spydark91, для этого и нужен кэш. Чтоб удалялось не все сразу а часть. То что удалилось грузить потом по новой.
0
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
12.04.2014, 00:18  [ТС] #14
Цитата Сообщение от KillAndEat Посмотреть сообщение
spydark91, для этого и нужен кэш. Чтоб удалялось не все сразу а часть. То что удалилось грузить потом по новой.
а когда нужно грузить вызывается метод getView в гриде, да?

Добавлено через 4 минуты
пока что пробую так
при объеме до 100 работает довольно таки быстро
но при 200 вылетает ошибка
и сделано без ссылок, поскольку так и не допер куда их прикрутить..прошу просветить

в этом коде сначала создаю адаптер
а потом создаю вьюхи асинхроннонно вытаскиваю битмапы

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class photosScreen_1 extends Fragment {  
    /*cut*/ 
    public SoftReference<List<Bitmap>> btms;
    public ImageView[] images; 
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
/*cut*/     
        images = new ImageView[parentA.links.length];
        List<Bitmap> listBitmap = new ArrayList<Bitmap>();
        btms = new SoftReference<List<Bitmap>>(listBitmap);
            shF();              
        return myView;      
    }
    
    private void shF() {
        GridView grid = (GridView)myView.findViewById(R.id.grid);
        grid.setAdapter(new ImageAdapter(parentA));
        // загружаем все картинки
        for (int i = 0;i<count;i++) {
            images[i] = new ImageView(parentA);
            new AsyncImageLoader(parentA,i).execute(parentA.links[i]);
        }
    }  
 
  
  
  
  public class ImageAdapter extends BaseAdapter {
/*cut*/
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView == null) {
                images[position].setLayoutParams(new GridView.LayoutParams(convertDpToPixel(140,parentA), convertDpToPixel(140,parentA))); 
            } else {
                images[position] = (ImageView) convertView;
            }       
            return images[position];
        }
 
    }
    
    public class AsyncImageLoader extends AsyncTask<String, Integer, Bitmap> {    
        private Context mContext = null;
        private int pos = 0;
        public AsyncImageLoader(Context cont, int po) {
            mContext = cont;
            pos = po;
        }
        protected Bitmap doInBackground(String... params) {
            Cursor cursor = mContext.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.Media._ID }, MediaStore.Images.Media.DATA + "='" + params[0] + "'", null, null);
            Bitmap bitmap=null;  
            if (cursor != null) 
                if (cursor.getCount() > 0) {
                    cursor.moveToFirst();
                    bitmap = MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), cursor.getInt(0), MediaStore.Images.Thumbnails.MINI_KIND, null);
               //     btms.get().add(bitmap);
                }
            cursor.close();
            return bitmap;//parentA.btms.get().get(pos);
        }
 
        @Override
        protected void onPostExecute(Bitmap result) {
            images[pos].setImageBitmap(result);  
        }
    }
  
}
Добавлено через 1 минуту
ну и лог
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
04-12 00:10:13.838: E/AndroidRuntime(26471): FATAL EXCEPTION: main
04-12 00:10:13.838: E/AndroidRuntime(26471): java.util.concurrent.RejectedExecutionException: pool=128/128, queue=10/10
04-12 00:10:13.838: E/AndroidRuntime(26471):    at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1961)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1315)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.os.AsyncTask.execute(AsyncTask.java:394)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at com.example.gallery.photosScreen_1.shF(photosScreen_1.java:71)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at com.example.gallery.photosScreen_1.onCreateView(photosScreen_1.java:54)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.View.measure(View.java:8553)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:581)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:365)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.View.measure(View.java:8553)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3261)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.View.measure(View.java:8553)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3261)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.View.measure(View.java:8553)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.ViewRoot.performTraversals(ViewRoot.java:915)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1991)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.os.Looper.loop(Looper.java:150)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at android.app.ActivityThread.main(ActivityThread.java:4385)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at java.lang.reflect.Method.invokeNative(Native Method)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at java.lang.reflect.Method.invoke(Method.java:507)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
04-12 00:10:13.838: E/AndroidRuntime(26471):    at dalvik.system.NativeStart.main(Native Method)
0
spydark91
85 / 85 / 2
Регистрация: 03.03.2011
Сообщений: 1,873
13.04.2014, 17:05  [ТС] #15
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
public class photosScreen_1 extends Fragment {  
    private static photosScreen parentA;
    public View myView = null;
    private static int pictureScale = 0;
    public List<SoftReference<ImageView>> images; 
    public List<SoftReference<Bitmap>> ref;
    
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.photos_screen_1, container, false);
        parentA =  (photosScreen)getActivity();
        
        ref = new ArrayList<SoftReference<Bitmap>>();
        images = new ArrayList<SoftReference<ImageView>>();
        for (int i=0;i<parentA.links.length;i++) {
            ref.add(new SoftReference<Bitmap>(null));
            images.add(new SoftReference<ImageView>(null));
        }
        GridView grid = (GridView)myView.findViewById(R.id.grid);
        grid.setAdapter(new ImageAdapter(parentA));
        return myView;  
    }
      
  public class ImageAdapter extends BaseAdapter {
        private Context mContext;
 
        public ImageAdapter(Context c) {
            mContext = c; 
        }
 
        public int getCount() {
            return images.size();
        }
 
        public Object getItem(int position) {
            return images.get(position).get();
        }
 
        public long getItemId(int position) {
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {         
            try {
                if (images.get(position).get() == null) {
                    images.set(position, new SoftReference<ImageView>(new ImageView(mContext))
                                }
                Bitmap bitmap = ref.get(position).get();
                if (bitmap != null) {
                    images.get(position).get().setImageBitmap(bitmap);
                } else {
                    new AsyncImageLoader(parentA,position).execute(parentA.links[position]);
                }
            } catch(Exception e) { }
            return images.get(position).get();
        }
 
    }
    
    public class AsyncImageLoader extends AsyncTask<String, Integer, Bitmap> {    
        private Context mContext = null;
        private int pos = 0;
        public AsyncImageLoader(Context cont, int po) {
            mContext = cont;
            pos = po;
        }
        protected Bitmap doInBackground(String... params) {
            Bitmap bitmap = ref.get(pos).get();
            if (bitmap == null) {
                Cursor cursor = //загрузка из памяти
                if (cursor != null) 
                    if (cursor.getCount() > 0) {
                        cursor.moveToFirst();
                        bitmap = // загрузка картинки из памяти
                        ref.set(pos, new SoftReference<Bitmap>(bitmap));
                    } 
                cursor.close();
            }          
            return bitmap;//parentA.btms.get().get(pos);
        }
 
 
        @Override
        protected void onPostExecute(Bitmap result) {
            try {
                images.get(pos).get().setImageBitmap(result);   
            } catch (Exception e) { }
        }
    }
  
}
лишнее поудалял

вот так все работает(с большим количеством картинок в том числе), вот только если не прокручивать грид быстро-быстро
если прокручивать очень быстро(видимо оно не успевает загружать-удалять), то вываливается с ошибкой
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
04-13 15:46:03.547: E/AndroidRuntime(15932): FATAL EXCEPTION: main
04-13 15:46:03.547: E/AndroidRuntime(15932): java.lang.NullPointerException
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.GridView.setupChild(GridView.java:1249)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.GridView.makeAndAddView(GridView.java:1225)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.GridView.makeRow(GridView.java:268)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.GridView.fillDown(GridView.java:221)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.GridView.fillGap(GridView.java:188)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.AbsListView.trackMotionScroll(AbsListView.java:3452)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:2950)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.os.Handler.handleCallback(Handler.java:587)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.os.Looper.loop(Looper.java:150)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at android.app.ActivityThread.main(ActivityThread.java:4385)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at java.lang.reflect.Method.invoke(Method.java:507)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
04-13 15:46:03.547: E/AndroidRuntime(15932):    at dalvik.system.NativeStart.main(Native Method)
подскажите как это разрулить

Добавлено через 1 час 12 минут
поправил это, написав небольшой кеш
мб кому пригодится,выложу код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
private class Cache {
        private List<SoftReference<Bitmap>> ref;
        private int[] relation;
        private int u,c;
        public Cache(int size) {
            u = size;
            c = 0;
            ref = new ArrayList<SoftReference<Bitmap>>();
            relation = new int [u];
            for (int i=0;i<u;i++) {
                ref.add(new SoftReference<Bitmap>(null));
                relation[i]= -1;
            }
        }
        public Bitmap get(int position) {
            for (int i=0;i<u;i++) {
                if (relation[i]==position) {
                    return ref.get(i).get();
                }
            }
            return null;
        }
        
        public void set(int position, Bitmap btm) {
            for (int i=0;i<u;i++) {
                if (relation[i] == position) {
                    return;
                }
            }
            relation[c] = position;
            ref.set(c, new SoftReference<Bitmap>(btm));
            c++;
            if (c>=u) c = 0;
        }
        
        
    }
0
13.04.2014, 17:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2014, 17:05
Привет! Вот еще темы с ответами:

Высокопроизводительные таблицы для отображение большого количетсва данных - Программирование Android
Доброго времени суток. Честно говоря, не думал, что буду писать этот вопрос, поскольку пришел с удобного мне мира Qt где есть превосходная...

Чек большого количества togglebutton при прогрессе seekBar тормозит - Программирование Android
Суть проблемы: есть 81 togglebutton у которых меняется background при помощи селектора. Эти кнопки чекаются за счет прогресса Seekbar....

Динамическая загрузка картинок из интернета - Программирование Android
Добрый день. Пишу спец. rss реадер для одного сайта. И столкнулся с проблемой. К примеру есть у меня список новостей (листвью), в котором...

Сохранить файл в памяти телефона, доступной из диспетчера файлов или на ПК - Программирование Android
Доброго времени суток. Мне необходимо сохранять некоторые файлы в публичной области памяти телефона (НЕ внешней, т.к. внешней памяти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru