在我的应用程序的MainActivity.onStart()
中,它从RESTful服务获取数据,使用服务中的数据填充本地SQLite数据库,然后使用该数据填充视图。使用RxJava,调用RESTful服务并填充SQLite的功能是可观察的,包含View的片段使用RxJava来订阅它。完成后,将通知View并从SQLite数据库获取数据。在此过程中,会出现一个进度循环(自动,我自己没有添加任何进度条形码)。填充视图后,圆圈为否
显示时间更长一切都很好。
从肖像 - >转动设备时横向(反之亦然),我的代码识别这一点并跳过RESTful服务,并使用类似的观察者/订阅者机制从SQLite数据库获取数据并填充视图。进度循环在这里再次显示,但是,这是问题,它会一直旋转并且永远不会消失,尽管应用程序继续正常运行。
是什么导致此进度圈出现?我该如何控制它?
第一位观察员/订阅者:
MyListFragment myListFragment = (MyListFragment) getSupportFragmentManager().findFragmentByTag(getResources().getString(R.string.fragment_main_tag));
mLoadAndStoreDataObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
try {
Utilities.loadAndStoreData(mActivity); // call RESTful service, populate SQLite
subscriber.onNext("Utilities.loadAndStoreData Done");
}
catch (Exception e) {
subscriber.onError(e);
}
}
}
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(myListFragment);
旋转设备时的观察者/订阅者:
MyListFragment myListFragment = (MyListFragment) getSupportFragmentManager().findFragmentByTag(getResources().getString(R.string.fragment_main_tag));
mLoadAndStoreDataObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
try {
// don't call restful service, Just tell observer that data is available in SQLite
subscriber.onNext("Utilities.loadAndStoreData Done");
}
catch (Exception e) {
subscriber.onError(e);
}
}
}
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(myListFragment);
MyListFragment
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
setListAdapter(null); // see if this prevents progress circle ... nope
return view;
}
@Override
public void onNext(String s) {
// SQLite is populated now, so display the data in the list view
ArrayList<MyListData> myListDataList = Utilities.getDataFromSQLite(getActivity());
MyListAdapter adapter = new MyListAdapter(getActivity(), android.R.layout.simple_list_item_1, myListDataList);
setListAdapter(adapter);
}
我正在测试的设备是(第一代)Nexus 7,Android 4.2.2和(第二代)Nexus 7,Android 4.4.4
答案:
LordRaydenMK建议当列表没有适配器集时,默认的ListView实现会显示一个微调器
事实确实如此。如下设置适配器会导致进度圆不显示
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
String[] values = new String[] { "Waiting for data ..." }; // never see this but whatever
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity() .getApplicationContext(), android.R.layout.simple_list_item_1, android.R.id.text1, values);
setListAdapter(adapter); // see if this prevents progress circle ... yep
return view;
}
答案 0 :(得分:1)
如果没有MyListFragment
的代码,我就无法提供帮助。但是我可以(试着)指出你正确的方向。
当列表没有设置适配器时,默认的ListView
实现会显示一个微调器。你确定要设置适配器吗?您使用setListAdapter
设置适配器吗?
在将RxJava与多个数据源一起使用时,我还想推荐一种不同的方法。查看Dan Lew的this blog post。它使用concat()
和first()
运算符来查找数据的最佳来源。
// Our sources (left as an exercise for the reader)
Observable<Data> memory = ...;
Observable<Data> disk = ...;
Observable<Data> network = ...;
// Retrieve the first source with data
Observable<Data> source = Observable
.concat(memory, disk, network)
.first();