Почему перестает работать приложение с 300 изображениями?

Я создал приложение, состоящее из 300 изображений. При запуске приложение работает плавно, без проблем. но когда я запускаю listactivity, которая загружает изображения, мое приложение перестает отвечать. Помоги мне.

Это мои коды Основная деятельность. Я копирую zip-файл изображения из папки ресурсов во внутреннее хранилище и извлекаю изображения во внутреннем хранилище, а затем показываю их в режиме gridview основной активности.

private void createDirs()
{
    File zipFileLoc = new File(storagePath, zipLoc);
    File unzipFileLoc = new File(storagePath, unzipLoc);
    File aksFileLoc = new File(storagePath, aks);
    if (zipFileLoc.exists() && unzipFileLoc.exists() && aksFileLoc.exists()){
        getFromStorage();
    }else{
        zipFileLoc.mkdirs();
        unzipFileLoc.mkdirs();
        aksFileLoc.mkdirs();

        copyAssets();
        unzip();

        getFromStorage();
    }
}

private void copyAssets()
{
    AssetManager assets = getAssets();
    String[] files = null;
    try{
        files = assets.list("");
    }catch(Exception e){
        Toast.makeText(this, "Failed to load images, please restart app", Toast.LENGTH_LONG).show();
    }
    for(String fileName : files){
        InputStream in = null;
        OutputStream out = null;
        try{
            in = assets.open(fileName);
            File zipOutFile = new File(storagePath + zipLoc, fileName);
            out =new FileOutputStream(zipOutFile);
            copyFile(in, out);
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
        }catch(Exception e){
            Toast.makeText(this, "Failed to load images, please restart app", Toast.LENGTH_LONG).show();
        }
    }
}

private void copyFile(InputStream in, OutputStream out) throws IOException
{
    byte[] buffer = new byte[1024];
    int read;
    while((read = in.read(buffer)) != -1){
        out.write(buffer, 0, read);
    }
}

private void unzip()
{
    pd = new ProgressDialog(this);
    pd.setMessage("Please wait...");
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    pd.setCancelable(false);
    pd.show();

    new UnZipTask().execute(storagePath + zipLoc + "/AAGRIKOLISTATUS.zip", storagePath + aks);
}

private class UnZipTask extends AsyncTask<String, Void, Boolean>
{
    @SuppressWarnings("rawtypes")
    @Override
    protected Boolean doInBackground(String[] p1)
    {
        String filePath = p1[0];
        String destinationPath = p1[1];

        File archive = new File(filePath);
        try{
            ZipFile zf = new ZipFile(archive);
            for(Enumeration e = zf.entries(); e.hasMoreElements();){
                ZipEntry entry = (ZipEntry) e.nextElement();
                unzipEntry(zf, entry, destinationPath);
            }
            UnzipUtil d = new UnzipUtil(storagePath + zipLoc + "/AAGRIKOLISTATUS.zip", storagePath + aks);
            d.unzip();
        }catch(Exception e){
            return false;
        }

        return true;
    }

    @Override
    protected void onPostExecute(Boolean result)
    {
        pd.dismiss();
    }

    private void unzipEntry(ZipFile zf, ZipEntry entry, String destinationPath) throws IOException
    {
        if (entry.isDirectory()){
            createDir(new File(destinationPath, entry.getName()));
            return;
        }

        File outputFile = new File(destinationPath, entry.getName());
        if (!outputFile.getParentFile().exists()){
            createDir(outputFile.getParentFile());
        }

        BufferedInputStream inputs = new BufferedInputStream(zf.getInputStream(entry));
        BufferedOutputStream outputs = new BufferedOutputStream(new FileOutputStream(outputFile));

        try{

        }finally{
            outputs.flush();
            outputs.close();
            inputs.close();
        }
    }

    private void createDir(File file)
    {
        if (file.exists()){
            return;
        }

        if (!file.mkdirs()){
            throw new RuntimeException("Cannot create file " + file);
        }
    }
}

private void getFromStorage()
{
    File file = new File(storagePath, aks);
    if (file.isDirectory()){
        listfile= file.listFiles();
        for(int i = 0; i < listfile.length; i++){
            f.add(listfile[i].getAbsolutePath());
        }
    }

    ad = new ImageAdapter(this);
    gv.setAdapter(ad);
}
public class ImageAdapter extends BaseAdapter
{
    Context context;

    public ImageAdapter(Context cxt)
    {
        this.context = cxt;
    }

    @Override
    public int getCount()
    {
        return f.size();
    }

    @Override
    public Object getItem(int p1)
    {
        return p1;
    }

    @Override
    public long getItemId(int p1)
    {
        return p1;
    }

    @Override
    public View getView(int p1, View p2, ViewGroup p3)
    {
        ImageView iv = new ImageView(context);
        Bitmap bm = BitmapFactory.decodeFile(f.get(p1));
        iv.setImageBitmap(bm);
        iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        iv.setLayoutParams(new GridView.LayoutParams(240, 240));

        return iv;
    }
}

Вот мой main.xml

<RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:ads = "http://schemas.android.com/apk/res-auto"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:padding = "5dp"
android:gravity = "center"
android:background = "#00ff85">

<GridView
    android:layout_height = "match_parent"
    android:layout_width = "match_parent"
    android:id = "@+id/aagrikolistatusphotoGridView"
    android:layout_above = "@+id/aagrikolistatusphotocomgoogleandroidgmsadsAdView"
    android:columnWidth = "90dp"
    android:layout_centerHorizontal = "true"
    android:layout_centerVertical = "true"
    android:horizontalSpacing = "5dp"
    android:numColumns = "auto_fit"
    android:stretchMode = "columnWidth"
    android:verticalSpacing = "5dp"/>

@ user202729 Я загрузил несколько своих кодов в основной вопрос.

Rakesh Bhagat 27.10.2018 12:32

отправьте Logcat пожалуйста

Milad Bahmanabadi 27.10.2018 12:50
3
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несмотря на то, что вы распаковываете изображения в фоновом потоке, вы загружаете их в основной поток, что вызывает сбой пользовательского интерфейса. Решение - использовать Glide или Picasso для загрузки изображений в фоновый поток. Пожалуйста, прочтите документацию Google: https://developer.android.com/topic/performance/graphics/load-bitmap#java
и попробуйте использовать один из них:
Скольжение: https://github.com/bumptech/glide
Пикассо: http://square.github.io/picasso/
Это должно помочь решить вашу проблему

Другие вопросы по теме