2010-07-26 2 views
1

내 데이터가로드 될 때까지 사용자가 진행 상황에 대한 적절한 피드백을 얻으려고 진행률 표시 줄을 android에서 사용하고 있습니다. 바의 코드는 아래와 같다 :진행률 표시 줄을 사용하면 목록보기가 채워지지 않습니다.

final ProgressDialog myProgressDialog; 

myProgressDialog = ProgressDialog.show(ListingPage.this,"Please Wait", "Loading Date", true); 
new Thread() { 
    public void run() { 
     try{ 
     setSelected();      
     sleep(5000); 
     } catch (Exception e) { } 
     myProgressDialog.dismiss(); 
    } 
}.start(); 

하는 setSelected() 메소드는 그 항목을 표시하는 목록보기를 사용하여 다음 배열 목록에 데이터를 삽입하고 배열 어댑터를 작성하고있다.

그래서 진행 막대에 setSelected() 메서드를 넣으면로드 원이 표시되지만로드가 완료되면 표시됩니다. listview에 아무 것도 표시되지 않습니다. 그러나 진행 바코드 (스레드 및 메서드 실행)를 가져 와서 setSelected() 메서드를 호출하면 listview에서 데이터를 성공적으로 선언합니다. 지금까지 진행 바코드가 어떤 일을하고 있다고 결론을 내었습니다 ... 그래서 내가 코드에 추가하거나 코드에서 제거 할 항목이 누락되었음을 알고 싶었습니다. 온라인 소스에서 데이터를 읽으면서 프로그램 진행률 표시 줄이 필요하며 시간이 오래 걸리므로 사용자가 불편할 수 있습니다.

답변

1

문제는 사용자 인터페이스를 다른 스레드에서 UI 스레드로 변경하려고 시도한 것일 수 있습니다. Android 스레드에서는 UI 스레드를 변경할 수 없습니다.

Async Task을 사용해 보시기 바랍니다. Asynct Task는 백그라운드 스레드에서 무언가를 수행하고 UI 스레드가 완료된 후에 그 결과를 게시 할 수있는 가능성을 제공합니다.

이 경우 setSelected 메소드를 데이터를 가져 오는 두 개의 메소드에서 분리하고 Array 및 기타 모든 것을 작성하고 어댑터를 작성하고 결과를 목록에 게시하는 메소드를 분리합니다.

myProgressDialog = ProgressDialog.show(ListingPage.this,"Please Wait", "Loading Date", true); 

final Result[] results = new Result[](); 

new AsyncTask<Void, Void, Void>() { 

    //This is done in the background 
    protected Void doInBackground(Void... params) { 
     results = getResults(); 
     return null; 
    } 

    //This id done in the UI Thread 
    protected void onPostExecute(Long result) { 
     publishResults(); 
     myProgressDialog.dismiss(); 
    } 

    } 
}.execute(); 
+0

Janusz! 위의 메서드를 사용했지만 코드를로드 할 때 검색 막대가 멈 춥니 다. new AsyncTask () { //이 작업은 백그라운드에서 수행됩니다. protected void doInBackground (void ... 매개 변수) { setSelected(); return null; } //이 ID는 UI 스레드에서 완료 됨 protected void onPostExecute (Long result) { populateList (data); myProgressDialog.dismiss(); } } .execute(); 나는 스레드가 매달려 있다고 생각한다. – kaibuki

+0

죄송합니다. 여기에 오류를 찾으려면 코드가 더 필요합니다. 원래 질문으로 편집 해보십시오. – Janusz