Pourquoi est-ce que je reçois l'erreur Voici mon code: P> tentative d'invoquer la méthode directe 'void asyncfinished (com.ats.atsver2.ui.db.classes.user)' sur une référence d'objet null code>. Sur l'onpostexecute, je reçois un résultat, mais quand j'essaie de l'envoyer par le délégué, je reçois l'erreur.
public class UserRepository {
private UserDao userDao;
private User user;
private LiveData<List<User>> allUsers;
public UserRepository(Application application) {
AtsDatabase database = AtsDatabase.getInstance(application);
userDao = database.userDao();
allUsers = userDao.getUsers();
}
private MutableLiveData<User> userSearched = new MutableLiveData<>();
private void asyncFinished(User userResult) {
if(userResult == null) return;
Log.i("TAG", "asyncFinished: " + userResult.getLastName());
userSearched.setValue(userResult);
}
public LiveData<User> getUserByUserName(String userName) {
new GetUserByUserNameAsyncTask(userDao).execute(userName);
}
public LiveData<List<User>> getAllUsers() { return allUsers; }
private static class InsertUserAsyncTask extends AsyncTask<User, Void, Void> {
private UserDao userDao;
private InsertUserAsyncTask(UserDao userDao) { this.userDao = userDao; }
@Override
protected Void doInBackground(User... users) {
userDao.insert(users[0]);
return null;
}
}
private static class GetUserByUserNameAsyncTask extends AsyncTask<String, Void, User> {
private LiveData<User> user;
private UserDao userDao;
private UserRepository delegate = null;
private GetUserByUserNameAsyncTask(UserDao userDao) { this.userDao = userDao; }
@Override
protected User doInBackground(String... strings) {
user = userDao.getUserByUserName(strings[0]); ======> I GET RESULT HERE
return null;
}
@Override
protected void onPostExecute(User user) {
super.onPostExecute(user);
Log.i("TAG", "onPostExecute: "+user.getLastName());
delegate.asyncFinished(user);
}
}
}
3 Réponses :
Vous avez créé et jamais après avoir assigné de la valeur. P > p> délégué code> objet avec
null code> valeur:
Vous n'abandonnez jamais délégué code> à l'instance de classe extérieure lorsque vous créez un nouveau
getuserbyusernamameasyncccTask code>. Comme il est nulle lorsque vous invoquez
asyncfinished () code> il lancera une NPE.
public LiveData<User> getUserByUserName(String userName) {
new GetUserByUserNameAsyncTask(userDao, this).execute(userName);
}
Vous devez mettre à jour le code comme celui-ci pour le faire fonctionner
Parce que vous n'initiez pas l'objet délégué, délégué d'usier privé = null;