2012-11-04 2 views
0

내 앱에서 웹에서 데이터를로드 한 다음 사용자에게 표시하는 중입니다. 데이터를로드하기 전에 앱에 진행률 대화 상자가 표시됩니다. 사용자가 작업로드 중 중간에 전화를 잠 그거나 서버가 과부하 상태가되어 응용 프로그램이 멈 추면 문제가 발생합니다. 진행률 대화 상자가 닫히지 않거나 필요한 데이터가 부족하기 때문에 충돌이 발생하는 경우가 있습니다.데이터로드 중 unitl succesfull 또는 user break

데이터를로드하는 중에 오류가 발생하면 사용자에게 몇 가지 대화 상자를 표시하여 오류에 대해 알리고 애플리케이션에 마지막 요청을 반복하도록 요청해야합니다. AlertDialog를 사용하려고했지만 성공하지 못했습니다. 여기

은 하나 개의 활동의 코드 (여기서 대화 진전이 없다,하지만 내가 데이터를로드하는 방법을 보여줍니다) :

@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()parser.getRegions()은 웹에서 데이터를로드한다.

나는 이런 식으로 뭔가를 할 :

boolean repeatRequest = true; 
    while (repeatRequest) { 
     try { 
      brands = parser.getBrands(); 
      repeatRequest = false; 
     } catch (IOException e) { 
      Log.e(e.getMessage()); 
      repeatRequest = showErrorDialog(); 
     } 
    } 

하지만이 코드는 백그라운드 스레드에서 실행하기 때문에 그렇게 관리하지 않았지만, 대화 상자가 UI 스레드에 표시해야한다. 나는 그것이 표준 접근법이어야한다고 생각하지만 그것을 발견하지 못했습니다. 이 부분을 구현하려면 어떻게해야합니까?

답변

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); 
     } 
    } 
}