0

私のアプリでは、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スレッドで表示されるはずです。それはそうするための標準的なアプローチであるべきだと私は信じていますが、それを見つけることができませんでした。どうすればこれを実装できますか?

4

1 に答える 1

1

最良の方法はを使用することAsyncTaskです。

private class LoadDataTask extends AsyncTask<Void, Integer, Object> {
    private ProgressDialog mProgress;

    protected Object doInBackground(Void... params) {
        // This method runs in background
        Object result = null;
        try {
            result = parser.parse();
        } catch (Exception e) {
            result = e.getMessage();
        }
        return result;
    }

    protected void onProgressUpdate(Integer... progress) {
        // This method runs in UI thread
        mProgress.setProgress(progress[0]);
    }

    protected void onPreExecute() {
        // This method runs in UI thread
        mProgress = new ProgressDialog(context);
        mProgress.show();
    }

    protected void onPostExecute(Object result) {
        // This method runs in UI thread
        mProgress.dismiss();

        if (result instance of String) {
            // Here you can launch AlertDialog with error message and proposal to retry
            showErrorDialog((String) result);
        } else {
            populateData(result);
        }
    }
}
于 2012-11-04T14:39:40.547 に答える