android studio中的游标加载器

cursorLoader in androidstudio

我是一个超级初学者,所以我只是关注一些项目,我知道 startActivityforResult 已被弃用,所以我使用 ActivityResultLauncher 更改了代码。但我不知道如何修复 CursorLoader 错误。你能告诉我如何解决吗?

原来的代码是这样的

 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        
        if(requestCode == PICK_PROFILE_FROM_ALBUM && resultCode == RESULT_OK) {

            String[] proj = {MediaStore.Images.Media.DATA};

            CursorLoader cursorLoader = new CursorLoader(this, data.getData(), proj, null, null, null);
            


            Cursor cursor = cursorLoader.loadInBackground();
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();

            //image path
            String photoPath = cursor.getString(column_index);

           
    }

这是当前代码

ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            new ActivityResultCallback<ActivityResult>() {
                @Override
                public void onActivityResult(ActivityResult result) {
                    
                    if(result.getResultCode() == Activity.RESULT_OK) {
                        Intent data = result.getData();
                        String[] proj = {MediaStore.Images.Media.DATA};

                        CursorLoader cursorLoader = new CursorLoader(this, data.getData(), proj, null, null, null);
                       

                        Cursor cursor = cursorLoader.loadInBackground();
                        int column_index =cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                        cursor.moveToFirst();

                        
                        String photoPath = cursor.getString(column_index);
 }

所以 CursorLoader 中的上下文应该是固定的。它需要 'Context' 但现在是 ActivityResultCallback。

不写this直接写youractivityname.this

假设您的 activity 名称是 MainActivity 这就是您传递上下文的方式:

CursorLoader cursorLoader = new CursorLoader(MainActivity.this, data.getData(), proj, null, null, null);
        

发生这种情况是因为在这种情况下 this 关键字是它应该引用的当前上下文,而当前上下文是匿名的 class,即ActivityResultCallback 的实例,但 CursorLoader 需要引用 ContextActivity 的实例。在这种情况下,简单的解决方法是将 .this 附加到 class 或 activity

的名称

假设你的ActivityMainActivity,那么这个

CursorLoader cursorLoader = new CursorLoader(this, data.getData(), proj, null, null, null);

会转向这个

CursorLoader cursorLoader = new CursorLoader(MainActivity.this, data.getData(), proj, null, null, null);

长 运行 项目中的典型情况是,有时您需要将现有代码库迁移到较新的 API。

关于 CursorLoader。如果 startActivityResult 启动器是 Activity 中的字段 这一行

CursorLoader cursorLoader = new CursorLoader(this, data.getData(), proj, null, null, null);

可以替换为

CursorLoader cursorLoader = new CursorLoader(YourActivityClass.this, data.getData(), proj, null, null, null);

我还看到游标加载到 UI 线程上,它会对性能产生影响