gpt4 book ai didi

java - 返回 List 的房间查询会卡住应用程序
转载 作者:行者123 更新时间:2023-12-01 17:24:55 25 4
gpt4 key购买 nike

我尝试使用以下代码从数据库加载一些数据并将其显示在 Activity 中:

PhoneNumberViewModel phoneNumberViewModel =
new ViewModelProvider(WorksideContactCard.this).get(PhoneNumberViewModel.class);

phoneNumberViewModel
.getPhoneNumbersById(contactID)
.observe(this,
numbers -> {
phoneNumberList = numbers;
});

准确地说,我不需要观察数据的变化,因为如果 Activity 恢复,数据将会刷新。但是上面的代码卡住了我的应用程序,尽管我在其他类中使用 AsyncTask 访问数据库。

为什么会这样?

编辑:

PhoneNumberViewModel.class:

public class PhoneNumberViewModel extends AndroidViewModel {
private PhoneNumberRepository phoneNumberRepository;
private LiveData<List<PhoneNumber>> allPhoneNumbers;

public PhoneNumberViewModel(@NonNull Application application) {
super(application);
phoneNumberRepository = new PhoneNumberRepository(application);
allPhoneNumbers = phoneNumberRepository.getAllPhoneNumbersLive();
}

public void insert(PhoneNumber phoneNumber) {
System.out.println("[PhoneNumberRepository] Adding new phoneNumber");
phoneNumberRepository.insert(phoneNumber);
}

public void update(PhoneNumber phoneNumber) {
phoneNumberRepository.update(phoneNumber);
}

public void delete(PhoneNumber phoneNumber) {
phoneNumberRepository.delete(phoneNumber);
}

public LiveData<List<PhoneNumber>> getAllPhoneNumbers() {
return allPhoneNumbers;
}

public LiveData<List<PhoneNumber>> getPhoneNumbersById(long contactId)
throws ExecutionException, InterruptedException {
return phoneNumberRepository.getPhoneNumbersByContactId(contactId);
}

PhoneNumberRepository.class

public class PhoneNumberRepository {
private PhoneNumberDao phoneNumberDao;
private LiveData<List<PhoneNumber>> allPhoneNumbers;
private LiveData<List<PhoneNumber>> phoneNumbersByIdList;

public PhoneNumberRepository(Application application) {

WorksideDatabase database = WorksideDatabase.getInstance(application);
phoneNumberDao = database.phoneNumberDao();
allPhoneNumbers = phoneNumberDao.getAllPhoneNumbers();
}

...

public LiveData<List<PhoneNumber>> getAllPhoneNumbersLive() {
return allPhoneNumbers;
}

public void deleteAllPhoneNumbers() {
new DeleteAllPhoneNumbersAsyncTask(phoneNumberDao).execute();
}

public LiveData<List<PhoneNumber>> getPhoneNumbersByContactId(long id)
throws ExecutionException, InterruptedException {
return new SelectPhoneNumberByIdAsyncTask(phoneNumberDao, id).get();
}

private static class SelectPhoneNumberByIdAsyncTask
extends AsyncTask<Long, Void, LiveData<List<PhoneNumber>>> {

private PhoneNumberDao phoneNumberDao;
private Long ID;

private SelectPhoneNumberByIdAsyncTask(PhoneNumberDao phoneNumberDao, Long contactId) {
this.phoneNumberDao = phoneNumberDao;
ID = contactId;
}

@Override
protected LiveData<List<PhoneNumber>> doInBackground(Long... contactId) {

ID = contactId[0];

return phoneNumberDao.getPhoneNumbersById(ID);
}
}

...
}

PhoneNumberDao.class:

@Dao
public interface PhoneNumberDao {

@Insert
void insert(PhoneNumber phoneNumber);

@Update
void update(PhoneNumber phoneNumber);

@Delete
void delete(PhoneNumber phoneNumber);

// Probably uneeded method
@Query("DELETE FROM phone_numbers_table")
void deleteAllPhoneNumbers();

// Delete entry/entries by ID
@Query("DELETE FROM phone_numbers_table WHERE id = :phoneNumberId")
void deleteByPhoneNumberId(long phoneNumberId);

// Retrieve entry/entries by contact ID
// @Query("SELECT * FROM phone_numbers_table WHERE contact_id = :contactId")
// List<PhoneNumber> getPhoneNumbersById(long contactId);

// Retrieve all saved phone numbers in LiveData format
@Query("SELECT * FROM phone_numbers_table")
LiveData<List<PhoneNumber>> getAllPhoneNumbers();

@Query("SELECT * FROM phone_numbers_table WHERE contact_id = :contactId")
LiveData<List<PhoneNumber>> getPhoneNumbersById(long contactId);

@Query("SELECT * FROM phone_numbers_table")
List<PhoneNumber> getAll();
}

最佳答案

return new SelectPhoneNumberByIdAsyncTask(phoneNumberDao, id).get(); 

这是你的问题,.get() 调用阻塞了主线程我建议切换到 Kotlin 并使用协程,或者在这里你可以使用回调来处理这个问题,而不是使用阻塞主线程的 AsyncTask.get() 。另外,顺便说一句,我上次听说异步任务将被弃用,所以也请记住这一点。这是问题的一种解决方案

public class Repository implements 
SelectPhoneNumberByIdAsyncTask.OnPhoneNumberFound {


@Override
public void onPhoneNumberFound(LiveData<List<Object>> list) {
//you can get the data you want here
}



}


class SelectPhoneNumberByIdAsyncTask extends AsyncTask<Long, Void,
LiveData<List<PhoneNumber//Correct this>>> {

interface OnPhoneNumberFound{
void onPhoneNumberFound(LiveData<List<PhoneNumberDao>> list);
}
OnPhoneNumberFound mListener;


private PhoneNumberDao phoneNumberDao;
private Long ID;

private SelectPhoneNumberByIdAsyncTask(Object phoneNumberDao, Long contactId) {
this.phoneNumberDao = phoneNumberDao;
ID = contactId;
}

@Override
protected LiveData<List<Object>> doInBackground(Long... contactId) {
ID = contactId[0];
mListener.onPhoneNumberFound(phoneNumberDao.getPhoneNumbersById(ID));
return null;
}

}

现在使用 .execute() 调用而不是 .get()

关于java - 返回 List<Object> 的房间查询会卡住应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61224151/

25 4 0