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
需要引用 Context
或 Activity
的实例。在这种情况下,简单的解决方法是将 .this
附加到 class 或 activity
的名称
假设你的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);
长 运行 项目中的典型情况是,有时您需要将现有代码库迁移到较新的 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 线程上,它会对性能产生影响
我是一个超级初学者,所以我只是关注一些项目,我知道 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
需要引用 Context
或 Activity
的实例。在这种情况下,简单的解决方法是将 .this
附加到 class 或 activity
假设你的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);
长 运行 项目中的典型情况是,有时您需要将现有代码库迁移到较新的 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 线程上,它会对性能产生影响