Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/12: Рейтинг темы: голосов - 12, средняя оценка - 4.92
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
1

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

10.04.2014, 15:37. Просмотров 2144. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

17
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
10.04.2014, 16:25 2
Задержку вызывает то, что у вас все картинки хранятся в оперативной памяти. И при большом количестве картинок ее просто не хватает и программа выдает OutOfMemoryException. Чтоб этого избежать вам нужно использовать ссылки SoftReference или WeakReference, что бы программа знала, что при необходимости эти объекты можно удалить при помощи сборщика мусора.
1
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
10.04.2014, 17:20 3
spydark91, и попробуйте загружать в отдельном потоке, отдавая в ответ Bitmap или Reference<Bitmap>
1
spydark91
86 / 86 / 13
Регистрация: 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
86 / 86 / 13
Регистрация: 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
86 / 86 / 13
Регистрация: 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
86 / 86 / 13
Регистрация: 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
86 / 86 / 13
Регистрация: 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
86 / 86 / 13
Регистрация: 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
86 / 86 / 13
Регистрация: 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
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.04.2014, 17:13 16
spydark91, не заморачивайтесь и используйте готовую библиотеку https://github.com/nostra13/Android-Universal-Image-Loader

И просто вызываете его в адаптере:

Java
1
ImageLoader.getInstance().displayImage("your_url", mageView);
Это отличная либа, сама всё закэширует, сама создаст потоки на загрузку.
0
spydark91
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
13.04.2014, 17:20  [ТС] 17
да все уже работает)
приятно самому разобраться же
надо понимать как такие вещи работают, хотя бы примерно
0
YuraAAA
1578 / 1319 / 282
Регистрация: 25.10.2009
Сообщений: 3,436
Записей в блоге: 2
13.04.2014, 19:21 18
spydark91, Кстати на счёт кэша - у андроида уже есть такой LruCache<K, V> http://developer.android.com/reference/android/util/LruCache.html
1
13.04.2014, 19:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.04.2014, 19:21

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

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

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


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

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

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