我是一个超级初学者,所以我只是跟随一些项目,我知道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
关键字引用了当前上下文,而当前上下文是匿名类,即。ActivityResultCallback
的实例,但CursorLoader
需要引用Context
或Activity
的实例。在这种情况下,简单的修复方法是将.this
附加到类或活动的名称
后。假设你的Activity
是MainActivity
,所以这个
CursorLoader cursorLoader = new CursorLoader(this, data.getData(), proj, null, null, null);
会变成这个
CursorLoader cursorLoader = new CursorLoader(MainActivity.this, data.getData(), proj, null, null, null);
不写this直接写youractivityname.this
假设您的活动名称为MainActivity,这就是您应该如何传递上下文:
CursorLoader cursorLoader = new CursorLoader(MainActivity.this, data.getData(), proj, null, null, null);
在长期运行的项目中,有时您需要将现有的代码库迁移到较新的API,这是典型的情况。
关于CursorLoader。如果startActivityResult
启动程序是您的活动中的字段这条线
CursorLoader cursorLoader = new CursorLoader(this, data.getData(), proj, null, null, null);
可以用
代替CursorLoader cursorLoader = new CursorLoader(YourActivityClass.this, data.getData(), proj, null, null, null);
我还看到游标被加载到UI线程上,它会对性能产生影响