私のプログラムでは、サーバーからデータを収集するAsynchTaskを介して、スピナーを介してデータからユーザーが選択するのを待ちます(AlertDialog.Builderは、データをスピナー形式で表示するために使用されます)。
私のコードは次のとおりです。
public class Splash extends Activity {
protected boolean _active = true;
protected int _splashTime = 1500;
protected long startTime = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
startTime = System.currentTimeMillis();
new InitialSetAsync().execute();
}
private class InitialSetAsync extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
InitialSetting ins = new InitialSetting(Splash.this);
ins.doInitialSetting();
try {
while ((System.currentTimeMillis() - startTime) < _splashTime) {
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
Intent intent = new Intent(getApplicationContext(),
MainActivity.class);
startActivity(intent);
Splash.this.finish();
}
}
}
スピナー形式のデータ表示部分:
public class InitialSetting {
private Context context;
DbTransaction dbTran;
Process checkProcess;
String userCountry;
String country = "";
String[] availableCountries;
int flag=0;
public InitialSetting(Context context) {
this.context = context;
}
public int doInitialSetting() {
checkProcess = new Process();
String hasVisit = checkProcess.retrieveFromPreference(context);
if (hasVisit.equals("true")) {
} else {
availableCountries = checkProcess.checkAvailableCountries();
final AlertDialog.Builder ab = new AlertDialog.Builder(context);
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
ab.setSingleChoiceItems(availableCountries, -1,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
country = availableCountries[whichButton];
if (!country.equals("") && country != null) {
Configuration.setCounty(country);
checkProcess.copyDatabaseFromServer(
country, context);
dbTran.storePreference(country);
dialog.cancel();
}
}
});
ab.show();
}
});
}
return 0;
}
}
私の場合、ユーザーがスピナーから値を選択してエラーを引き起こす前に、スレッドが実行されています。ユーザーが値を選択するまで非同期タスクを一時停止する方法。