2013-09-04 2 views
0

я следующий кусок кода:Android, в асинхронном режиме и диалогах

public class SomeActivity extends Activity { 
    Context context; 
    List<MenuItem> menuItems; 

    public void importList(View v) { 
     menuItems = new ArrayList<MenuItem>(); 
     ProgressDialog dialog = ProgressDialog.show(this.context, "TITLE", "MSG"); 

     MyAsyncTask task = new MyAsyncTask(context); // Context is here because I tried to create ProgressDialog inside pre/postExecute, but it doesn't work either 
     task.execute(); 
     try { 
      // menuItems = task.get(); 
     } catch(Exception e) { 
      // : (
     } 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // ... 
     this.context = this; 
    } 
} 

Когда я комментирую строку, где я получаю значения от AsyncTask ("MenuItems = task.get()") Everythings работать нормально. Но когда я раскомментирую его, появляется ProgressDialog ПОСЛЕ завершения задачи и возвращенного значения. Почему это?

Я думаю, что он имеет отношение к этим контекстам (вот почему я включил метод onCreate), но я не знаю, как его исправить. Очевидно, что я хочу, чтобы ProgressDialog отображал перед выполнением задачи, а не после.

Не уверен, что релевантно - MyAsyncTask выполняет http-запрос и некоторый синтаксический анализ json.

+2

'sth' не слово. –

+2

Согласовано с кодомMagic. Метод 'AsyncTask'' get() 'в значительной степени бесполезен, поскольку он блокирует поток пользовательского интерфейса и эффективно делает вашу асинхронную задачу синхронной. – Squonk

ответ

2

Я думаю, что это имеет н сделать с этими контекстами

Вовсе нет. Кроме того, при отправке Context из Activity вам не нужно создавать переменную. Просто используйте this или ActivityName.this.

MyAsyncTask task = new MyAsyncTask(this); 

Но когда я раскоментировать, ProgressDialog появляется после завершения выполнения задания, и возвращаемого значения. Почему это?

Вызов get() блокирует UI, поэтому вы не видите прогресс, пока это не будет сделано. Вам не нужно это вызывать. Точка onProgressUpdate() такова, что фоновый поток (doInBackground()) может назвать его обновлением UI, так как doInBackground() не работает на UI.

Удалите эту строку из своего кода и никогда не смотрите на нее снова. Если есть причина, по которой вы считаете нужным, пожалуйста, объясните, и мы сможем помочь вам найти лучший способ.

Редактировать

See this SO answer об обновлении, когда задача выполнена

+0

Да, мне нужна эта строка, чтобы получить результат - menuItems. К этому моменту я понял это: Android ASync task ProgressDialog не показывается, пока фоновый поток не закончится (не знаю, почему я не видел эту тему раньше) Итак, как я могу передать результат моей деятельности? Рабочий процесс подобен Пользователь нажимает кнопку. AsyncTask запущен, он извлекает содержимое с сервера и использует его для создания массива menuItems. В это время я хочу, чтобы пользователь увидел ожидающий диалог. В Activity, когда у меня есть мои пункты меню, я могу, наконец, отобразить AlertDialog с этими элементами меню. –

+0

См. Мое редактирование. Этот ответ охватывает его выполнение, если его внутренний класс, и если он не покрывает, используя интерфейс, чтобы отправить результаты. Даже имеет короткий пример – codeMagic

Смежные вопросы