일부 데이터를 레이아웃에로드하려고합니다. AsyncTask
을 통해 데이터를로드하고 있는데, SQLite 데이터 소스의 데이터를로드 한 다음 해당 데이터를 완료시 레이아웃에 삽입합니다. 이 시간 동안 진행률 표시 줄을 표시하려면 작업 시작시 레이아웃에 추가하고 작업 완료시 레이아웃에서 제거하십시오. 여기 백그라운드 작업에서 데이터 소스 작업 중 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
'ItemsDataSource'와'lookupItems'의 소스는 어떻게 생겼습니까? 귀하의 활동이 다른 데이터베이스 조회를하고 있습니까? – twaddington