如何控制自动显示不确定的进度圈

时间:2015-06-23 13:45:48

标签: android android-progressbar rx-java

在我的应用程序的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;
}

1 个答案:

答案 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();