Issue
I call a AsyncTask method to retrieve a entry from my room database. I do this in an AsyncTask as to not block the UI thread. In my doInBackGround method I assign a value to the object and we can see here it gets set:
On my post execute I call a method which uses this object. But it assigns as null and the program fails.
How come this value that I assigned in doInBackground didn't persist when I want to access in another method?
AsyncTask
void getAtcUser(String username) {
new getAtcUserAsyncTask(username).execute();
}
private class getAtcUserAsyncTask extends AsyncTask<Void, Void, Void> {
String name;
getAtcUserAsyncTask(String name) {
this.name = name;
}
@Override
protected Void doInBackground(Void... params) {
atcUserStats = mAtcDao.findByName(name);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
ATC_GameOver atc_gameOver = new ATC_GameOver();
atc_gameOver.callOnChanged();
}
}
Retrieve assigned value
public AtcUserStats getAtcUserStats(){
return atcUserStats;
}
callOnChanged
public void callOnChanged() {
mRepository = new UsersRepository(getApplication());
AtcUser = mRepository.getAtcUserStats(); //Assgins null here - then program fails when I try access this object on the next line
int singlesPlayed = AtcUser.getSinglesPlayed();
The error I am getting is a null object reference but how when I've assigned it previously? Is there a better way of doing this?
Solution
Manged to get it working. Rather than retrieving it in callOnChanged I passed it as a parameter to callOnChanged on post-execute and AtcUser was no longer null.
AsyncTask
private class getAtcUserAsyncTask extends AsyncTask<Void, Void, Void> {
String name;
getAtcUserAsyncTask(String name) {
this.name = name;
}
@Override
protected Void doInBackground(Void... params) {
setAtcUserStats(mAtcDao.findByName(name));
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
ATC_GameOver atc_gameOver = new ATC_GameOver();
atc_gameOver.callOnChanged(atcUserStats);
}
}
private void setAtcUserStats(AtcUserStats byName) {
atcUserStats = byName;
}
callOnChanged
public void callOnChanged(AtcUserStats atc_user) {
mRepository = new UsersRepository(app);
AtcUser = atc_user;
Answered By - COYG
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.