Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
1

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

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

Author24 — интернет-сервис помощи студентам
Если изображения больше 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.04.2014, 15:37
Ответы с готовыми решениями:

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

Загрузка большого количества картинок на форму
Здравствуйте, друзья. Интересует такой вопрос. Как лучше всего загрузить на форму большое кол-во...

Загрузка большого количества картинок в ListBox
Доброго времени суток форумчане. Подскажите пожалуйста как решить данную проблему. Есть листбокс,...

Сохранение в файл большого количества картинок и данных через STREAM
Все привет. Есть много данных (integer, string) и картинки (bitmap). Задача сохранить скопом...

17
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
10.04.2014, 16:25 2
Задержку вызывает то, что у вас все картинки хранятся в оперативной памяти. И при большом количестве картинок ее просто не хватает и программа выдает OutOfMemoryException. Чтоб этого избежать вам нужно использовать ссылки SoftReference или WeakReference, что бы программа знала, что при необходимости эти объекты можно удалить при помощи сборщика мусора.
1
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
10.04.2014, 17:20 3
spydark91, и попробуйте загружать в отдельном потоке, отдавая в ответ Bitmap или Reference<Bitmap>
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
10.04.2014, 19:30  [ТС] 4
spydark91, и попробуйте загружать в отдельном потоке, отдавая в ответ Bitmap или Reference<Bitmap>
т.е. стоит делать так
шаг 1-
формируем массив из Reference<Bitmap>, вытаскивая в цикле картинки из памяти
шаг 2-
опять же в цикле выводим картинки из массива, сформированного выше, на экран
так?
0
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
10.04.2014, 19:38 5
Шаг 3 http://nostra13android.blogspo... art-1.html

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

Вот еще почитайте http://developer.android.com/t... index.html
1
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
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 00:08 7
Java
1
 imageView.setImageBitmap(btms.get().get(position));
У вас скорее всего вылетит с критом когда нибудь, т.к. таски не сразу выполняются и на момент установки поток может еще не завершить свою работу, а вы уже будете ставить картинку. В таком случае на место вашей подгружающейся картинки нужно ставить какую нибудь заглушку и когда картинка подгрузится в потоке нужно будет найти нужную вьюху и заменить заглушку на миниатюру. Так же неплохо было бы организовать какой нибудь кэш для картинок, чтоб при скролинге картинки каждый раз не подгружались. В этом вам поможет класс LruCache или LinkedHashMap, только опять же все это дело должно быть засинхронизировано иначе вы рискуете получить ошибку когда потоки начнут долбиться в одно место.
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
11.04.2014, 14:19  [ТС] 8
как узнать какие из вьюх в данный момент отображаются при скролинге? чтоб в них загружать?

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

На сколько я помню Soft удалит объекты только когда будет нехватка памяти, а weak при любом запуске сборщика мусора если конечно этот объект не используется.
0
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
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 15:07 11
b удалиться только тогда когда у вас будет OutOfMemory непосредственно перед ним.

Грид попроизводительнее будет.
1
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
11.04.2014, 20:06  [ТС] 12
Цитата Сообщение от KillAndEat Посмотреть сообщение
b удалиться только тогда когда у вас будет OutOfMemory непосредственно перед ним.
ну вот он удалится после того как я загружу 30 фотографию
и как быть потом?
как то это отлавливать и по новой загружать?
и как загружать по новой, если памяти нет уже
0
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
11.04.2014, 23:52 13
spydark91, для этого и нужен кэш. Чтоб удалялось не все сразу а часть. То что удалилось грузить потом по новой.
0
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
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
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.04.2014, 17:13 16
spydark91, не заморачивайтесь и используйте готовую библиотеку https://github.com/nostra13/An... age-Loader

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

Java
1
ImageLoader.getInstance().displayImage("your_url", mageView);
Это отличная либа, сама всё закэширует, сама создаст потоки на загрузку.
0
86 / 86 / 13
Регистрация: 03.03.2011
Сообщений: 1,873
13.04.2014, 17:20  [ТС] 17
да все уже работает)
приятно самому разобраться же
надо понимать как такие вещи работают, хотя бы примерно
0
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
13.04.2014, 19:21 18
spydark91, Кстати на счёт кэша - у андроида уже есть такой LruCache<K, V> http://developer.android.com/r... Cache.html
1
13.04.2014, 19:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.04.2014, 19:21
Помогаю со студенческими работами здесь

Отображение большого количества данных
Здравствуйте. Подскажите как реализовать показ данных из json? Нужно вывести разные данные,...

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

Загрузка большого количества текста
Добрый день. У меня на локальном компьютере есть файл в котором содержится большое количество...

Загрузка большого количества файлов
Здравствуйте! Прошу помощи и подсказок, столкнулся со следующей проблемой, имеется большое...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru