2012-11-26 2 views
3

일부 데이터를 레이아웃에로드하려고합니다. AsyncTask을 통해 데이터를로드하고 있는데, SQLite 데이터 소스의 데이터를로드 한 다음 해당 데이터를 완료시 레이아웃에 삽입합니다. 이 시간 동안 진행률 표시 줄을 표시하려면 작업 시작시 레이아웃에 추가하고 작업 완료시 레이아웃에서 제거하십시오. 여기 백그라운드 작업에서 데이터 소스 작업 중 ProgressBar 회전 안 함

거친 개요입니다 :

내 로딩 레이아웃은 Android API docs for ProgressBar에서 복사
private class ItemLoader extends AsyncTask<Void, Void, List<Item>> { 

    private Context context; 
    private LayoutInflater inflater; 
    private View loading; 

    public DataLoader(Context context) { 
     this.context = context; 
     this.inflater = LayoutInflater.from(context); 
     this.loading = createLoading(); 
    } 

    private View createLoading() { 
     return inflater.inflate(R.layout.loading, null); 
    } 

    @Override 
    public void onPreExecute() { 
     // Insert 'loading' view into the 'items' layout. 
     LinearLayout layout = (LinearLayout) findViewById(R.id.items); 
     layout.addView(loading); 
    } 

    @Override 
    protected List<Item> doInBackground(Void... params) { 
     return loadItemsFromDataSource(); 
    } 

    private List<Item> loadItemsFromDataSource() { 
     ItemsSource d = new ItemsDataSource(context); 
     d.open(); 
     try { 
      return d.lookupItems(); 
     } finally { 
      d.close(); 
     }  
    } 

    @Override 
    public void onPostExecute(List<Item> items) { 
     LinearLayout layout = (LinearLayout) findViewById(R.id.items); 
     // Remove 'loading' view from the 'items' layout. 
     layout.removeView(loading); 
     // Add items to the 'items' layout. 
     for (Item item: items) { 
      addItemToLayout(item, layout); 
     } 
    } 

:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.itemsLayout); 
    ... 
    new ItemLoader(this).execute(); 
} 

I : 활동의 onCreate() 방법 중이라고

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 

    <ProgressBar 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     style="@android:style/Widget.ProgressBar.Small" 
     android:layout_marginRight="5dp" /> 
    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@string/loading" /> 

</LinearLayout> 

AsyncTask '로딩'스피너와 테 데이터가 백그라운드로로드되는 동안 xt가 내 레이아웃에 추가되고 데이터가 레이아웃에 추가 될 때이 스피너/텍스트가 제거됩니다.

그러나 doInBackground() 메서드가 실행 중일 때 회 전자가 회전하지 않습니다. UI 스레드의 진행률 막대를 추가 및 제거하고 있습니다 (onPreExecute()onPostExecute() 메서드에 있음).

흥미롭게도 데이터 소스에서 데이터를로드하기 전에 sleep()doInBackground()으로 호출하면 회 전자가 회전하는 것을 볼 수 있습니다.

@Override 
protected void doInBackground(Void... params) { 
    sleepForFiveSeconds(); // spinner is spinning 
    List<Item> items = loadItemsFromDataSource(); // spinner stops spinning 
    sleepForFiveSeconds(); // spinner still not spinning 
    return items; 
} 

을 그리고 그것은 단지 AsyncTask 내에서 조작 스피너 아니다 : 데이터 소스 호출이 이루어지면 그러나, 회 전자가 회전을 멈 춥니 다. ProgressBar가 액티비티의 레이아웃에 정의되거나 액티비티의 onCreate() 메서드에서 동적으로 추가되어 액티비티에 ProgressBar가 추가 될 때 동일한 동작을 감지합니다. 이러한 경우 데이터 소스 조회가 수행 될 때까지 회 전자가 회전 중입니다. 데이터 소스 조회가 반환되면 다시 회전을 시작합니다.

그래서 UI 스레드 내에서 스피너가 액세스되지만 백그라운드 스레드의 데이터 소스 작업으로 인해 이러한 스피너가 중지되는 것 같습니다.

제안 사항?

추가 편집 :이 내 넥서스 7 (안드로이드 4.2)과 HTC 폰 (안드로이드 2.3.4) 함께, 최소 SDK 버전을 설정 안드로이드 매니페스트와 10

+0

'ItemsDataSource'와'lookupItems'의 소스는 어떻게 생겼습니까? 귀하의 활동이 다른 데이터베이스 조회를하고 있습니까? – twaddington

답변

0

에 대신 추가하고 회 전자를 제거하는 레이아웃에서 기본 파일 itemsLayout에 파일을 포함시키고 가시성을 전환 해보십시오. 그래서 findViewById(R.id.loading).setVisibility(View.VISIBLE);과 같은 것입니다. 이것은 당신이 지금하고있는 전체 레이아웃을 팽창시키는 것보다 시간이 적게 걸릴 것입니다.

+0

답장을 보내 주셔서 감사합니다. 로딩 레이아웃을 액티비티의 레이아웃에 직접 추가하고'onPreExecute' 동안로드 레이아웃을 VISIBLE로 설정하고'onPostExcecute' 중에 로딩 레이아웃을 설정했습니다. 회 전자가 올바르게 나타나고 사라 지지만 데이터 소스 작업 중에는 회전하지 않습니다. –

+0

배경 작업은 얼마나 걸리나요? 타이밍을 잡으려고 했습니까? 스피너가 효과적으로 시작하기에는 너무 빠르지 만 가능합니다. 회 전자의 'android : indeterminate' 속성을'true'로 설정해보십시오. – twaddington

+0

데이터로드는 거의 순간적으로부터 수 초까지 걸릴 수 있습니다. 데이터 로딩이 끝나고 여전히 회 전자가 회전하지 않은 후에'sleep()'호출을 백그라운드 작업의'doInBackground()'메소드에 넣었다. 나는 명시 적으로'android : indetermite'를'true'로 설정하려고 시도 할 것이지만, 스피너는 문서에 따라 기본적으로 불확정합니다. –

관련 문제