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