вы можете сделать следующее в onResume()
в вашем предпочтении:
- начать
async call
с ... - установить предпочтение на отключение с подсказкойчто значения извлекаются
- сеть для извлечения значений (либо когда она не имеет значений, либо всегда) - асинхронно, поэтому она не останавливает возобновление
- обновляет запись предпочтения с выбранными вамизначения
- включают предпочтение и показывают подсказку по умолчанию
Недостаток, если это так, что ваши предпочтения будут обновляться слишком часто (например, всегда, когда вашэкран предпочтений запускается), но с этим вы можете справиться со случаем, когда результат сетевого вызова выдает список, в котором ранее выбранного значения больше нет (например, покажите пользователю диалоговое окно, в котором говорится, что его выбор больше не доступен).
Кроме того, это довольно сложная задача (поскольку вы должны определить Handler
, потому что асинхронное выполнение живет в другом потоке ...)
Это выглядело бычто-то вроде этого (при условии, что вы делаете это в своем PreferenceActivity
)
import android.os.Handler;
import android.os.AsyncTask;
import android.os.Message;
public class xyz extends PreferenceActivity {
...
// define a handler to update the preference state
final Handler handler = new Handler() {
public void handleMessage( Message msg ) {
ListPreference dpref = (ListPreference) getPreferenceManager().findPreference("debug");
dpref.setEnabled( msg.getData().getBoolean("enabled") );
dpref.setSummary( msg.getData().getString("summary") );
}
};
private class updatePref extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg) {
Message msg = handler.obtainMessage();
Bundle data = new Bundle();
data.putBoolean("enabled", false ); // disable pref
data.putString("summary", "Getting vals from network..." ); // set summary
msg.setData( data );
handler.sendMessage(msg); // send it do the main thread
ListPreference dpref = (ListPreference) getPreferenceManager().findPreference("debug");
String values[];
// call network function and let it fill values[]
// do things according to the returned values,
// eg check if there are any, check if the user has
// already selected one, display a message if the
// user has selected one before but the values do not
// contain them anymore, ...
// set the new values
dpref.setEntries(values);
dpref.setEntryValues(values);
data.putBoolean("enabled", true ); // enable pref
data.putString("summary", "Please choose" ); // set summary
msg.setData( data );
handler.sendMessage(msg); // send it do the main thread
return null;
}
}
public void onResume() {
....
new updatePref().execute();
}
}
Конечно, вы можете позвонить new updatePref().execute()
в любом месте, так что вы также можете привязать его к Button
, onCreate()
или где угодно(нет необходимости делать это в onResume()
).