私のアプリでは、Webからデータを読み込んで、それをユーザーに表示しています。データをロードする前に、アプリは進行状況ダイアログを表示します。ロード操作の途中でユーザーが電話をロックしたり、サーバーが過負荷になり、アプリケーションがフリーズしたときに応答できない場合、進行状況ダイアログが閉じられないため、または場合によっては必要なデータが不足しているためにクラッシュする場合に問題が発生します。
データの読み込み中にエラーが発生した場合は、ユーザーにダイアログを表示してエラーについて知らせ、アプリケーションが最後のリクエストを繰り返すように依頼します。AlertDialogを使用しようとしましたが、成功しませんでした。
これが1つのアクティビティのコードです(ここには進行状況ダイアログはありませんが、データをロードする方法を示しています):
@EActivity(R.layout.layout_splash)
@RoboGuice
public class SplashScreenActivity extends Activity {
@Inject
private AvtopoiskParserImpl parser;
@Bean
BrandsAndRegionsHolder brandsAndRegionsHolder;
@ViewById(R.id.splash_progress)
ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadData();
}
@Background
protected void loadData() {
publishProgress(10);
LinkedHashMap<String, Integer> brands = null;
try {
brands = parser.getBrands();
} catch (IOException e) {
Log.e(e.getMessage());
}
publishProgress(50);
LinkedHashMap<String, Integer> regions = null;
try {
regions = parser.getRegions();
} catch (IOException e) {
Log.e(e.getMessage());
}
publishProgress(70);
populateData(brands, regions);
}
@UiThread
protected void populateData(LinkedHashMap<String, Integer> brands, LinkedHashMap<String, Integer> regions) {
Intent intent = new Intent(SplashScreenActivity.this, SearchActivity_.class);
brandsAndRegionsHolder.brandsMap = brands;
brandsAndRegionsHolder.regionsMap = regions;
publishProgress(100);
startActivity(intent);
finish();
}
@UiThread
void publishProgress(int progress) {
progressBar.setProgress(progress);
}
}
parser.getBrands()
Webからparser.getRegions()
データを読み込んでいます。
私はこのようなことをしたい:
boolean repeatRequest = true;
while (repeatRequest) {
try {
brands = parser.getBrands();
repeatRequest = false;
} catch (IOException e) {
Log.e(e.getMessage());
repeatRequest = showErrorDialog();
}
}
しかし、このコードはバックグラウンドスレッドで実行されるため、なんとかそうすることができませんでしたが、ダイアログはUIスレッドで表示されるはずです。それはそうするための標準的なアプローチであるべきだと私は信じていますが、それを見つけることができませんでした。どうすればこれを実装できますか?