Почему мой объект не устанавливается в AsyncTask? - PullRequest
0 голосов
/ 14 мая 2019

Я вызываю метод AsyncTask, чтобы получить запись из базы данных моей комнаты. Я делаю это в AsyncTask, чтобы не блокировать поток пользовательского интерфейса. В моем методе doInBackGround я присваиваю объекту значение, и мы видим, что он установлен:

enter image description here

В моем посте execute я вызываю метод, который использует этот объект. Но он присваивается как ноль, и программа завершается ошибкой.

Почему это значение, которое я присвоил в doInBackground, не сохранилось, когда я хочу получить доступ другим методом?

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();
    }
}

Получить присвоенное значение

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();

Ошибка, которую я получаю, является пустой ссылкой на объект, но как, если я назначил ее ранее? Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 14 мая 2019

удалось заставить его работать. Вместо того, чтобы извлекать его в callOnChanged, я передал его в качестве параметра callOnChanged при пост-выполнении, и AtcUser больше не был нулевым.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...