更新内容时,用户界面冻结

时间:2017-04-27 15:36:33

标签: android performance android-recyclerview android-viewpager

我的应用程序有一个ViewPager,最多可容纳5个片段,每个片段包含一个RecyclerView。当我的IntentService从Internet获取新数据时,我需要更新UI中的数据。然而,这会冻结我的UI,因此PullDownToRefresh-Animation冻结,我无法滚动或做任何事情。一旦它加载了所有数据,我就可以再次移动,因此它不会永久冻结。

老实说,我不知道我必须改变什么才能处理我的数据更改或者更有效率或者通常应该对付那些冻结。

public void displayData() {
    int school = mSharedPreferences.getInt(PREFERENCE_SCHOOL, -1);
    String classYearLetter = mSharedPreferences.getString(PREFERENCE_CLASS_YEAR_LETTER, "");
    int classYear = Integer.parseInt(classYearLetter.substring(0, 2));
    String classLetter = classYearLetter.substring(3);

    Calendar calendar = Calendar.getInstance();
    List<String> tabTitles = new ArrayList<>();

    List<SubstitutionDay> databaseResults;
    if (mSharedPreferences.getBoolean(PREFERENCE_SHOW_WHOLE_PLAN, false)) {
        databaseResults = mDatabaseHandler.getSubstitutionDayList(school, 0, "");
    } else {
        databaseResults = mDatabaseHandler.getSubstitutionDayList(school, classYear, classLetter);
    }


    mMainTabLayout.removeAllTabs();
    for (int n = 0; n < databaseResults.size(); n++) {
        if (databaseResults.get(n).getSubstitutionList().size() > 0) {
            calendar.setTimeInMillis(databaseResults.get(n).getDate());
            String tempDate = dateFormatter.format(calendar.getTime());
            String tempWeekday = weekdayFormatter.format(calendar.getTime());
            tabTitles.add(tempWeekday + " " + tempDate.substring(0, 6));
        }
    }

    if (tabTitles.size() == 0) {
        mMainTabLayout.addTab(mMainTabLayout.newTab().setText("Keine Vertretungen gefunden"));
        mMainViewPager.removeAllViews();
    } else {
        PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(), tabTitles, "substitution", databaseResults);
        mMainViewPager.setAdapter(pagerAdapter);
        mMainTabLayout.setupWithViewPager(mMainViewPager);
    }

    mMainViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mMainTabLayout) {
        @Override
        public void onPageScrollStateChanged(int state) {
            toggleRefreshing(state == ViewPager.SCROLL_STATE_IDLE);
        }
    });

    mMainTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            mMainViewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });

    mSwipeRefreshLayout.setRefreshing(false);
}

如果有新的更新以及我第一次打开我的应用时,上面的方法会从我的BroadcastReceiver调用。 IntentService处理后台工作,因为据我所知它不应该阻止UI。

知道我需要改变什么才能解决问题吗?如果还有我应该提供的代码,请告诉我!感谢。

0 个答案:

没有答案