首页 > 解决方案 > 如何使用 AsyncTask 显示所有照片

问题描述

我想收集图片目录中的所有照片以在 GridView 中显示,因此尝试了两种方法。1_不使用AsyncTask:这种方式效果很好,但它有一个问题是应用程序冻结几秒钟以获取指定目录及其子目录中的所有照片。2_使用AsyncTask:这种方式不会得到任何图像并且图像列表总是空的,我知道我应该将Asynctask用于需要大量时间来处理的进程,我不知道我在使用AsyncTask时错过了什么。我想要的是找到一种方法来使用 AsyncTask 收集所有照片并冻结应用程序并提前致谢。

public static class ImagesFragment extends Fragment {
                static List<Image> imagesList = new ArrayList<>();
                GridViewRecyclerAdapter gridViewRecyclerAdapter;
                GridView gridView;
                Spinner spinner;
                public static File file = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
    
                @Override
                public void onCreate(@Nullable Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
    //                imagesList = loadImageData(file);
                    gridViewRecyclerAdapter = new GridViewRecyclerAdapter(imagesList, getContext());
                }
    
                @Nullable
                @Override
                public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
                    View view = inflater.inflate(R.layout.fragment_images, container, false);
                    spinner = view.findViewById(R.id.spinner);
                    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getContext(), R.array.spinner, android.R.layout.simple_spinner_item);
                    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    spinner.setAdapter(adapter);
                    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                        @Override
                        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                            switch (position){
                                case 0:
                                    break;
                                case 1:
                                    break;
                            }
                        }
    
                        @Override
                        public void onNothingSelected(AdapterView<?> parent) {
    
                        }
                    });
                    gridView = view.findViewById(R.id.grid_view);
                    gridView.setAdapter(gridViewRecyclerAdapter);
                    return view;
                }
    
                public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
                    // Raw height and width of image
                    final int height = options.outHeight;
                    final int width = options.outWidth;
                    int inSampleSize = 1;
                    if (height > reqHeight || width > reqWidth) {
                        final int halfHeight = height / 2;
                        final int halfWidth = width / 2;
                        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
                        // height and width larger than the requested height and width.
                        while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) {
                            inSampleSize *= 2;
                        }
                    }
                    return inSampleSize;
                }
    
                public static List<Image> loadImageData(File file) {
                    String fileType;
                    String extension;
                    if(file.isDirectory()){
                        File[] files = file.listFiles();
                        for(File file1: files){
                            if(file1.isDirectory())
                                loadImageData(file1);
                            else{
                                extension = MimeTypeMap.getFileExtensionFromUrl(file1.getPath());
                                if (extension != null) {
                                    fileType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                                    if(fileType != null)
                                        if(fileType.contains("image")){
                                            BitmapFactory.Options options = new BitmapFactory.Options();
                                            options.inSampleSize = calculateInSampleSize(options, 500, 500);
                                            options.inJustDecodeBounds = false;
                                            Bitmap bitmap = BitmapFactory.decodeFile(file1.getAbsolutePath(), options);
    //                                    bitmap = Bitmap.createScaledBitmap(bitmap, bitmap.getWidth(), bitmap.getHeight())
                                            imagesList.add(new Image(bitmap, file1.getName(), file1.getPath()));
    
                                        }
                                }
                            }
                        }
                    }
                    else {
                        extension = MimeTypeMap.getFileExtensionFromUrl(file.getPath());
                        if (extension != null) {
                            fileType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
                            if(fileType != null)
                                if(fileType.contains("image")){
                                    BitmapFactory.Options options = new BitmapFactory.Options();
                                    options.inSampleSize = calculateInSampleSize(options, 500, 500);
                                    options.inJustDecodeBounds = false;
                                    Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(), options);
                                    imagesList.add(new Image(bitmap, file.getName(), file.getPath()));
                                }
                        }
                    }
                    return imagesList;
                }
            }
    
            public static class GridViewRecyclerAdapter extends BaseAdapter {
                List<Image> imageList;
                Context context;
                static int position;
    
                public GridViewRecyclerAdapter(List<Image> imageList, Context context){
                    this.imageList = imageList;
                    this.context = context;
                }
    
                @Override
                public int getCount() {
                    return imageList.size();
                }
    
                @Override
                public Object getItem(int position) {
                    return imageList.get(position);
                }
    
                @Override
                public long getItemId(int position) {
                    return position;
                }
    
                @Override
                public View getView(int position, View convertView, ViewGroup parent) {
                    ViewHolder viewHolder;
                    if(convertView == null){
                        convertView = LayoutInflater.from(context).inflate(R.layout.images_item, parent, false);
                        viewHolder = new ViewHolder();
                        viewHolder.imageView = convertView.findViewById(R.id.image_view);
                        viewHolder.imageView.setTag(imageList.get(position).path);
                        viewHolder.textView = convertView.findViewById(R.id.text_view);
                        convertView.setTag(viewHolder);
                    }
                    else
                        viewHolder = (ViewHolder) convertView.getTag();
                    new LoadImageAsyncTask().execute(ImagesFragment.file.getAbsolutePath());
                    viewHolder.imageView.setImageBitmap(imageList.get(position).bitmap);
                    viewHolder.textView.setText(imageList.get(position).title);
                    GridViewRecyclerAdapter.position = position;
                    return convertView;
                }
    
                public static class ViewHolder{
                    ImageView imageView;
                    TextView textView;
                }
    
                static class LoadImageAsyncTask extends AsyncTask<String, Void, List<Image>> {
                    @Override
                    protected List<Image> doInBackground(String... objects) {
                        ImagesFragment.imagesList = ImagesFragment.loadImageData(new File(objects[0]));
                        return ImagesFragment.imagesList;
                    }
                }
            }

标签: androidandroid-studioandroid-fragments

解决方案


推荐阅读