【问题标题】:Updating code to include error handling and a worker thread更新代码以包括错误处理和工作线程
【发布时间】:2022-01-19 02:45:33
【问题描述】:

我是安卓开发的新手。我希望将下面的代码(用于查询媒体集合)更新为包含用于错误处理的 try 和 catch 块,以及在工作线程中调用的 query() 方法。

public void getAllImages(){
        Uri imageCollection;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            imageCollection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL);
        } else {
            imageCollection = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
        }
 
        String[] projection = new String[] {
                MediaStore.Images.Media._ID,
                MediaStore.Images.Media.DISPLAY_NAME,
                MediaStore.Images.Media.DATE_ADDED,
                MediaStore.Images.Media.SIZE
        };
 
        String sortOrder = MediaStore.Images.Media.DATE_ADDED + " DESC";
 
        Cursor cursor = getActivity().getContentResolver().query(imageCollection , projection, null, null, sortOrder);
        int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
        int nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
        int dateColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED);
        int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE);
 
        while (cursor.moveToNext()) {
            long id = cursor.getLong(idColumn);
            String name = cursor.getString(nameColumn);
            int duration = cursor.getInt(dateColumn);
            int size = cursor.getInt(sizeColumn);
            Uri uriImage = Uri.withAppendedPath(imageCollection, ""+ id);
            ImageModel imageModel = new ImageModel();
            imageModel.setImage(uriImage);
            imageList.add(imageModel);
        }
        cursor.close();

【问题讨论】:

    标签: android mediastore


    【解决方案1】:

    Cursor 上方的代码不会以其当前格式引发异常。甚至 由于MediaStore.VOLUME_EXTERNAL 不是null,MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL); 不会抛出异常。

    下一步是将其余代码封装在 try-catch-finally 中,然后将其封装在 Thread.run() 调用中。

    Thread thread = new Thread() {
        public void run() {
            Cursor cursor = null;
            try {
                cursor = getActivity().getContentResolver().query(imageCollection, projection, null, null, sortOrder);
                int idColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
                int nameColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME);
                int dateColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATE_ADDED);
                int sizeColumn = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE);
    
                while (cursor.moveToNext()) {
                    long id = cursor.getLong(idColumn);
                    String name = cursor.getString(nameColumn);
                    int duration = cursor.getInt(dateColumn);
                    int size = cursor.getInt(sizeColumn);
                    Uri uriImage = Uri.withAppendedPath(imageCollection, "" + id);
                    ImageModel imageModel = new ImageModel();
                    imageModel.setImage(uriImage);
                    imageList.add(imageModel);
                }
                cursor.close();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
        }
    }
    //Start the thread
    thread.start();
    

    现在有很多其他方法可以使用后台线程来产生比仅使用 Thread 更好的流,包括 Worker(来自 jetpack)、RxJava 和 Guava。如果使用 Kotlin,还有 coroutines。

    https://developer.android.com/reference/androidx/work/Worker

    https://github.com/ReactiveX/RxJava

    https://github.com/google/guava/wiki/ListenableFutureExplained

    【讨论】:

    • 我尝试了代码...图像未加载,并且没有给出错误消息。原始代码正在运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 2020-06-10
    相关资源
    最近更新 更多