Почему мое приложение для галереи (разработанное с использованием Glide) занимает около 500 МБ ОЗУ - PullRequest
0 голосов
/ 19 июня 2019

Я сделал приложение для галереи, которое показывает сохраненные изображения в автономном режиме с помощью библиотеки GLIDE в recyclerView, но когда я смотрю Profiler в Android Studio, он показывает мне, что приложение занимает около 500 МБ памяти. Это нормально, что мойприложение занимает столько памяти.

Однако мое приложение не падает, но оно иногда зависает при отображении изображений, а также изображения загружаются вместе (я вижу, что размер полосы прокрутки уменьшается)

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

This is the normal look of my app Sometime when scrolling some white space also come between the images.

1 Этонормальный вид моего приложения.

2 Иногда при прокрутке между изображениями также появляются пробелы (показаны коричневым овалом).

для уменьшения памяти,Я попытался уменьшить высоту imageView (думая, что теперь может быть скольжение пришлось загружать меньше пикселей), но не сработало вообще.для разрешения пользователя я попытался использовать Руководство разработчика Android, но все равно не повезло.

// this is my main activity
    private static final int MY_PERMISSIONS_REQUEST = 100;
    private Cursor mCursor=null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // layout initialization code
        mCursor = getImageCursor();
        requestStoragePermission();

        recyclerView = findViewById(R.id.imageRecyclerView);
        mAdapter = new mayankImageAdapter(this,mCursor);

      //..... (setting the recyclerView)
        RecyclerView.LayoutManager mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);

    }

    private void requestStoragePermission() {
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // permission was granted, yay! Do the
                    // file-related task you need to do.

                }
                else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
        }
    }


    public Cursor getImageCursor(){
        try{
            Uri externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            String[] projection = new String[]{MediaStore.Images.Media._ID, MediaStore.Images.Media.TITLE,
                            MediaStore.Images.Media.SIZE, MediaStore.Images.Media.DATA};
            String sortOrder = MediaStore.Images.Media.TITLE+" ASC";

            Cursor imageCursor = getContentResolver().query(externalUri,
                        projection,null,null,sortOrder);
            return imageCursor;
        }catch(Exception e){
            return null;
        }
    }
    @Override
    protected void onDestroy() {
        mCursor.close();
        super.onDestroy();
    }
}

mayankImageAdapter.java

\\ onBindViewHolder method
    @Override
    public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int position) {
        if(imageCursor!=null) {
            imageCursor.moveToFirst();
            imageCursor.moveToPosition(position);
            int strIndex = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

            String str = imageCursor.getString(strIndex);
            File myimageloc = new File(str);
            GlideApp.with(callingActivity).load(myimageloc).into(myViewHolder.imgView); 
        }else{
            return;
        }
    }

acitivity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"
    android:id="@+id/imageRecyclerView"
    xmlns:android="http://schemas.android.com/apk/res/android" />

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

Спасибо

Изменить: Я обновил код разрешения пользователя и код адаптера RecyclerView.

...