2012-06-07 5 views
0

У меня есть кнопка, и когда я на нее нажимал, я загружаю другую Activity, onCreate этого. Я вызываю метод, который заполняет счетчик данными из веб-службы.Android: Заполните Spinner с диалоговым окном прогресса

Ну, когда я нажимаю на эту кнопку, экран остается «замороженным», а затем показывает действие. Итак, я подумал, что это может быть хорошо, показывает диалог прогресса для пользователя, и после получения возврата веб-службы завершает диалог прогресса.

Я пробовал использовать Handler, и теперь я пытаюсь использовать AsyncTask, но, получив NullPointerException, потому что моя программа заполняет прядильщик, прежде чем веб-сервис вызывается.

private void fillSpinner(){ 
    //runWebService(); 
    new CallWebServiceAsyncTask().execute(null); 

    mAdapter = new PlanesAdapter(this, allPlanes); 
    mList.setAdapter(mAdapter); 
} 


class CallWebServiceAsyncTask extends AsyncTask<Void, Void, Void> { 

private ProgressDialog progressDialog; 

@Override 
protected void onPreExecute() { 

    progressDialog = new ProgressDialog(PlanesActivity.this); 
    progressDialog.setMessage("Loading..."); 
    progressDialog.show(); 

} 

@Override 

protected Void doInBackground(Void... v) { 

    runWebService(); 
    return null; 

} 

@Override 

    protected void onPostExecute(Void result) { 

    progressDialog.dismiss(); 

} 

} 

ответ

1

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

Вам необходимо заполнить данные после получения данных в onPostExecute Method

@Override 

    protected void onPostExecute(Void result) { 

    progressDialog.dismiss(); 

    mAdapter = new PlanesAdapter(this, allPlanes); 
    mList.setAdapter(mAdapter); 

} 
+0

Ничего себе! Ошибка ... Спасибо, Самир! –

0

Что @SamirMangroliya предложил правильно, но вы даже не нужно знать, где вы собираетесь не так. Когда вы вызываете AsyncTask, вы просите приложение выполнить некоторые действия в фоновом режиме, которые будут выполняться в потоке, отличном от UI. Теперь, когда вы вызываете execute() на свой объект AsyncTask, код приложения, записанный в функции doInBackground(Void... v), запускается в фоновом режиме, и ваш элемент управления возвращается к следующему оператору после вызова execute()[new CallWebServiceAsyncTask().execute(null)], что в вашем случае является действием заполнения значений адаптера. Эти значения еще не получены из веб-службы. Единственное место, где вы можете быть уверены, что ваше фоновое действие завершено, - это функция onPostExecute(Void result), где, как вам предлагается, вы можете создать свой адаптер.

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