Так что это на самом деле должно быть довольно легко. На самом деле вы не дали нам много работы с точки зрения деталей реализации, поэтому я сделаю все возможное, чтобы наполовину написать код для вас и дать вам хороший общий ответ.
Мы собираемся выполнить запрос из отдельного потока, чтобы не блокировать поток пользовательского интерфейса, пока мы ожидаем ответа по сети. Это можно сделать разными способами, в том числе с помощью AsyncTask, IntentService или какого-либо загрузчика. Я думаю, в вашем случае лучше всего подойдет пользовательский класс, производный от класса AsyncTaskLoader. Итак, давайте посмотрим, как это будет выглядеть (обратите внимание, что вам понадобится доступ к некоторым более новым API для использования загрузчика, проверьте http://developer.android.com/resources/articles/backward-compatibility.html, если вы пишете это приложение для чего-то меньшего, чем API-уровень 11) .
MyActivity extends Activity implements LoaderManager.LoaderCallbacks<List<SpinnerItem>>{
private Adapter<SpinnerItem> spinnerAdapter;
private static final int SPINNER_LOADER_ID = 0;
public void onCreate(Bundle icicle){
Spinner theSpinner = findViewById(R.id.the_spinner);
spinnerAdapater = new Adapter<SpinnerItem>(...); //create empty adapter
spinnerAdapater.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
theSpinner.setAdapter(spinnerAdapater);
getLoaderManager().initLoader(SPINNER_LOADER_ID, null, this);
}
public Loader<List<SpinnerItems>> onCreateLoader(int id, Bundle arg){
//Create and return your loader
}
public void onLoadFinish(Loader<List<SpinnerItem>> loader, List<SpinnerItem> data){
//update your adapater with the new data
}
public void onLoaderReset(Loader<List<SpinnerItem>> loader){
//clear out all the data in the adapter
}
}
Здесь все довольно просто. Вы должны быть в состоянии заполнить пробелы, читая о загрузчиках, адаптерах и т. Д. На страницах разработчиков Android. Тот факт, что мы используем «List», полный «SpinnerItem», конечно же, будет зависеть от вашей конкретной реализации, а также от типа адаптера, который вы решите использовать. Не стесняйтесь выбирать любые фактические структуры данных, которые вы хотите. Еще раз, обратитесь к страницам разработчика Android для деталей. Что касается класса загрузчика, вы захотите сделать что-то вроде этого:
MyNetworkLoader extends AsyncTaskLoader<List<SpinnerItem>>
public MyNetworkLoader(Context context){
super(context);
}
List<SpinnerItem> loadInBackground(){
//Get data from server
}
}
В методе loadInBackground вы будете использовать свой CustomHttpClient для запроса вашего сервера и преобразования ответа в некую структуру данных (как и раньше, в этом примере мы используем «Список» из «SpinnerItem»).
Как последнее замечание, ваш счетчик будет пустым, пока ваш сетевой запрос не будет выполнен. Вы можете включить какую-то логику, информирующую пользователя о том, что загружается содержимое счетчика.
Вот и все. Новый API-интерфейс загрузчика упрощает работу.