onPostExecute () не может использовать элементы MainActivity - PullRequest
1 голос
/ 19 декабря 2011

у меня doInBackground(). после функции я хочу изменить TextView на MainActivity. но когда я запускаю функцию в основной деятельности, я получаю NullPointerException в строке TextView.

protected String doInBackground(Object... arguments) {

    some code..

    return result;
}

@Override
protected void onPostExecute(String result) {
    if(result!=null)
        new MainActivity().setScoreListUpdate(result);
}

MainActivity:

public void setScoreListUpdate(String settings)
{
    String[] yeniscore = settings.split("\\|");

    if(yeniscore.length > 1)
    {
            birinci.setText(yeniscore[1]);  << NULLPOINTEREXC.
    }
}

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

Причина, по которой это дает NullPointerException, заключается в том, что вы создаете новый экземпляр MainActivity вместо того, чтобы работать с существующим.

Что вам нужно сделать, это передать ссылку на ваш Activity на AsyncTask и затем вызвать ваш метод для этой ссылки.

Итак, в вашем AsyncTask -классе у вас будет переменная:

private MainActivity myMainActivity;

Добавьте конструктор к вашему AsyncTask -классу:

public MyAsyncTaskClassName( MainActivity activity ) {
    myMainActivity = activity;
}

Затем в onPostExecute вы делаете:

myMainActivity.setScoreListUpdate(result);
1 голос
/ 19 декабря 2011

Используйте

MainActivity.this.setScoreListUpdate(result);

вместо

new MainActivity().setScoreListUpdate(result);

в методе postExecute.

Кроме того, TextView с именем birinci должен быть полем в вашем классе MainActivity, а не просто переменной в методе onCreate, например.

РЕДАКТИРОВАТЬ: Так работает в моей программе. Проверьте различия.

public class DeviceSettingsStatsActivity extends ListActivity {

    AsyncTask<Void, Integer, ListAdapter> task = null;
    ListAdapter listAdapter = null;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        task = new ComputeTask().execute();
    }

    protected void viewComputeResult(ListAdapter result) {
        setListAdapter(result);
    }

    private class ComputeTask extends AsyncTask<Void, Integer, ListAdapter> {

        @Override
        protected ListAdapter doInBackground(Void... params) {
            // some stuff
        }

        @Override
        protected void onPostExecute(ListAdapter result) {
            DeviceSettingsStatsActivity.this.viewComputeResult(result);
        }   
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...