4

ここでは、ビューページャーをフラグメントで高速化する方法などの質問があります。viewpagerを素早くフラグメントに変換する方法は?

私がやっていることの説明:

を私はそれぞれのデータをviewpagerするフラグメントをロードしていたコンテンツの数にそれぞれdata.Basedを示すために、5つのウェブビューと1つのリストビューを含むフラグメントを持っています。インプリメンテーションは、ビュー・ページャーのすべての良いがパフォーマンスは非常に遅いです。

コードスニペット:

ページャアダプタのロード:

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:

問題を検出することが、私がしようとするあなたは星いくつ:

  1. メモリに問題がないことを確認するためにAndroidStudioのMemory Monitorを確認してください。

  2. フラグメント内のレイアウトの一部を非表示にします。スワイプがスムーズになると、レイアウトに問題があります。

  3. お試しHardware Accelerationです。それは改善するかもしれない。

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

これは動作していません – Boopathi

+2

@Boopathi FragmentStatePagerAdapterを試しましたか? – nshmura

+0

はい、私はそれだけで試してみました。 – Boopathi

2
viewpager.setOffscreenPageLimit(count); 

、またはFragmentStatePagerAdapterを使用しています。 asynctaskもメモリリークを引き起こす可能性があります。フラグメントで正しく使用するようにしてください。

+0

私はそのために改造を使用しています...また、メモリリークをチェックするリークカナリアを使用しています。 – Boopathi

関連する問題