4

在这里我有一个问题,如如何使片段快速查看寻呼机。如何使viewpager快速转换片段?

解释我在做什么:

我有包含五个Web视图和一个列表视图,以显示各自的data.Based上的内容计数我加载片段与各自的数据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个问题时,使用片段应用程序变得缓慢并且有时会崩溃。

有未捕获的异常消息

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 

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

+0

没有集合,你需要使用的开发工具,以确定您的问题。使用方法跟踪来确定您的时间花在哪里。使用LogCat检查与崩溃相关的Java堆栈跟踪。等等。 – CommonsWare

+0

@CommonsWare当我加载更多数量的碎片来查看寻呼机时,它没有发生任何异常。 – Boopathi

+0

@CommonsWare我已经更新了我的日志。也没有内存泄漏。 – Boopathi

回答

3

UPDATE:

发现问题,我recoomend你尝试:

  1. 检查AndroidStudio的Memory Monitor确认存在与内存没有问题。

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

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

ORIGINAL

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

FragmentPagerAdapter将片段保留在内存中。 (当片段变得不可见时,片段只会被分离,而不会被删除。)在你刷了很多页之后,内存不足。所以你应该使用FragmentStatePagerAdapter
FragmentStatePagerAdapter当片段变得不可见时移除片段。

或者您应该从onDestoryView方法中删除Fragment中的引用。 这样的:

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. 
    } 
} 
+0

这不起作用 – Boopathi

+2

@Boopathi你试过FragmentStatePagerAdapter吗? – nshmura

+0

是的,我只用过那个。 – Boopathi

2
viewpager.setOffscreenPageLimit(count); 

对于页面的屏幕外的量,或使用FragmentStatePagerAdapter。 asynctask也可能导致内存泄漏,请确保您在碎片中正确使用它们。

+0

我正在使用改造...也使用泄漏金丝雀检查内存泄漏。 – Boopathi