асинхронная задача не обновляет экран - PullRequest
2 голосов
/ 02 апреля 2011

У меня есть метод, который выполняется с помощью asyncTask с progressdialog. После того, как этот метод выполнен, он меняет некоторые вещи на экране - спиннер и текстовое представление. Внутри моего метода я обновляю их новыми данными. Я знаю, что метод работает отлично и работает как надо, потому что когда я нажимаю стрелку на счетчике, новые данные находятся внутри него. Внутри метода вызываются setText () и notifyDataSetChanged () - кажется, они не обновляют экран. Добавление notifyDataSetChanged () в onPostExecute () моей асинхронной задачи, похоже, тоже ничего не делает.

Есть идеи, что не так?

Это мой код

MyMethod ()

aa=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
                        for(Object tmpObject:objects){
                            aa.add(tmpObject.getName());
                        }
                        spin=(Spinner)findViewById(R.id.spinner);
                        spin.setOnItemSelectedListener(this);
                        aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                        spin.setAdapter(aa);
                        aa.notifyDataSetChanged();
                        txt=(TextView)findViewById(R.id.txt);
                        txt.setText("Woohoo!");

Мой asyncTask

class loginTask extends AsyncTask<Void, Void, Void> {
    protected void onPreExecute() {
           pd = ProgressDialog.show(login.this, "Logging you in...", "Please wait", true, false); 
          }

    @Override
     protected Void doInBackground(Void... unused) {
         myMethod();
        return null;
     }
        protected void onPostExecute(Void unused) {
         pd.dismiss();




     }
}

Почему экран не обновляется после завершения диалога? Он просто обновляется, если я не использую asyncTask. Добавление notifyDataSetChanged () к postexecute также ничего не делает.

Ответы [ 2 ]

8 голосов
/ 02 апреля 2011

Метод doInBackground отсутствует в потоке пользовательского интерфейса, поэтому, если вы хотите выполнять обновления пользовательского интерфейса, вы должны делать это в onProgressUpdate или onPostExecute.

2 голосов
/ 02 апреля 2011

doInBackground - метод будет выполняться в фоновом потоке, поэтому не должен пытаться взаимодействовать с объектами пользовательского интерфейса.Вы не можете выполнить здесь txt.setText ("Woohoo!");и т.д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...