如何使用片段快速转换viewpager?

时间:2016-07-26 17:57:19

标签: android android-fragments android-viewpager fragmentpageradapter android-pageradapter

在这里,我有一些问题,例如如何使用片段快速查看寻呼机。

我在做什么的解释:

我有一个片段,其中包含五个Web视图和一个列表视图以显示相应的数据。根据内容计数,我将使用相应的数据将片段加载到viewpager。实现明智的一切都很好,但是视图寻呼机的性能非常慢。

代码段:

寻呼机适配器加载:

FragmentPagerAdapter mFragmentPagerAdapter = new ViewPagerAdapter(getActivity(), getChildFragmentManager(), takeExamResponse.getPayloads().getQuestions(), mFragmentNavigator, takeExamResponse.getPayloads().getType(), "finished".equals(getArguments().getString("IS_FINISHED")) ? true : false, mQuestionsFragment);
viewPager.setAdapter(mFragmentPagerAdapter);

PagerAdapter:

import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import com.comquest.fragment.ViewPagerFragment;
import com.comquest.interfaces.FragmentNavigator;
import com.comquest.response.Question;
import com.comquest.utilities.EGApplication;

import java.util.List;


public class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Question> takeExamResponse;
    private final Context context;
    FragmentNavigator fragmentNavigator;
    String type = "";
    private boolean isFinshed;
    private EGApplication.Listener mListener;

    public ViewPagerAdapter(Context context, FragmentManager fm, List<Question> response, FragmentNavigator fragmentNavigator, String type, boolean isFinshed, EGApplication.Listener mListener) {
        super(fm);
        this.takeExamResponse = response;
        this.isFinshed = isFinshed;
        this.context = context;
        this.mListener = mListener;
        this.fragmentNavigator = fragmentNavigator;
        this.type = type;
    }

    @Override
    public Fragment getItem(int position) {
        return ViewPagerFragment.newInstance(context, takeExamResponse.get(position), fragmentNavigator, type, isFinshed, mListener, position);
    }

    @Override
    public int getCount() {
        return takeExamResponse.size();
    }

    @Override
    public int getItemPosition(Object object) {
        notifyDataSetChanged();
        return POSITION_NONE;
    }

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
        FragmentManager manager = ((Fragment) object).getFragmentManager();
        FragmentTransaction trans = manager.beginTransaction();
        trans.remove((Fragment) object);
        trans.commit();
    super.destroyItem(container, position, object);
}
}

我正在做考试类的应用,每个考试有100到150个问题。当我加载30到150个问题时,使用片段app变慢和有时崩溃。

有未捕获的异常消息

07-31 23:50:25.350 22065-22065/exam.test E/ApkAssets: Error while loading asset assets/natives_blob_64.bin: java.io.FileNotFoundException: assets/natives_blob_64.bin
07-31 23:50:25.350 22065-22065/exam.test E/ApkAssets: Error while loading asset assets/snapshot_blob_64.bin: java.io.FileNotFoundException: assets/snapshot_blob_64.bin
07-31 23:50:27.499 22065-23275/exam.test E/libEGL: validate_display:255 error 3008 (EGL_BAD_DISPLAY)
07-31 23:52:00.941 22065-22065/exam.test E/libc++abi: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
07-31 23:52:01.359 22065-22065/exam.test A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 22065

我需要一些最佳解决方案。

3 个答案:

答案 0 :(得分:3)

<强>更新

为了发现问题,我重新考虑你试试:

  1. 检查AndroidStudio&#39; Memory Monitor以确认内存没有问题。

  2. 隐藏片段中的部分布局。然后,如果滑动变得平滑,则问题出在布局上。

  3. 尝试Hardware Acceleration。它可能会有所改善。

  4. <强> ORIGINAL

    std::bad_alloc可能是由内存泄漏引起的。

    FragmentPagerAdapter将片段保存在内存中。 (当片段成为不可见时,片段只会被分离,不会被删除。)刷完许多页面后,内存不足。

    所以你应该使用FragmentStatePagerAdapter 当片段变得不可见时,FragmentStatePagerAdapter会删除片段。

    或者您应该在onDestoryView方法中删除片段中的引用。 像这样:

    public class ViewPagerFragment extends Fragment {
    
        ...
        private FragmentNavigator fragmentNavigator;
        private String type = "";
        private boolean isFinshed;
        private Question question;
        private EGApplication.Listener mListener;
        ...
    
        @Override
        public void onDestroyView() {
            super.onDestroyView();
            fragmentNavigator = null;
            mListener = null;
            question = null;
            //other things might be necessary for prevent memory leaks.
        }
    }
    

答案 1 :(得分:2)

viewpager.setOffscreenPageLimit(count); 

用于屏幕外的页面数量,或使用FragmentStatePagerAdapter。 asynctask也会导致内存泄漏,确保你在片段中正确使用它们。

答案 2 :(得分:1)