之前的片段花费了太多时间来加载

时间:2017-01-16 07:11:16

标签: android fragment fragment-backstack

我有一个主要基于片段的应用。每个片段都涉及它自己的json解析和json的图像加载。另外需要注意的是,当它被替换时,我在ech片段上调用了addToBackStack(null)。 当我在片段之间切换,并按下后退按钮时,需要相当长的时间4-5秒才能准确加载前一个片段。有没有什么方法可以最小化加载时间?

我已经使用异步任务来获取数据,异步任务在片段的onAttach()方法中执行,以防止在按下后退按钮时进行json解析。

4 个答案:

答案 0 :(得分:0)

这可能很容易成为模拟器问题,但如果不是,可能是因为您正在加载主线程上的所有信息而不是异步任务。制作异步任务会在后台加载信息并在完成后更新UI

答案 1 :(得分:0)

   public void currentFragment(int position, Bundle bundle) {
        switch (position) {

            case 105:
                MainFragment workoutFragment = MainFragment.newInstance("", "");
                workoutFragment.setArguments(bundle);
                replaceFragment(workoutFragment, "front");
                break;

            case 108:

                break;
            default:
                replaceFragment(new MainFragment(), "Main");
                break;
        }
    }

    private void replaceFragment(Fragment fragment, String tag) {
        String backStateName = fragment.getClass().getName();
        try {
            boolean fragmentPopped = fm.popBackStackImmediate(backStateName, 0);
            if (!fragmentPopped && fm.findFragmentByTag(backStateName) == null) {
                //fragment not in back stack, create it.
                FragmentTransaction ft = fm.beginTransaction();
                ft.add(R.id.fragment_container, fragment, backStateName);
                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                ft.addToBackStack(backStateName);
                ft.commitAllowingStateLoss();
                //ft.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

// inside  Backpress    @Override
   // public void onBackPressed()
//  if (fm.getBackStackEntryCount() == 1) {

//     super.onBackPressed();

// }

//  to add fragment call like this 

// currentFragment(101,null);

// what it do is popup from stack not add again and again that is best method to achiveve this if still getting problem then ask me again

答案 2 :(得分:0)

  

如果您不需要在背板上重新加载碎片图像,那么您可以使用它   特技

每个片段中的

  View mView; // declare it globally

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       if(mView == null){ // it will not reload image it will set first time view which is loaded. 
          mView = inflater.inflate(R.layout.fragment_dashboard, null);
        }
        return rootView;
    }
  

这将立即加载。它将恢复以前的视图   backpress

答案 3 :(得分:0)

一个原因可能是您正在加载的数据量。要克服这种情况,您可以Handler使用Runnable

// Declaration
private Handler layoutHandler = new Handler();
private Runnable mRunnable;

// Initialization
mRunnable = new Runnable() {
       @Override
       public void run() {
            hideProgress();
            // Perform an action such as binding your data
       }
};

现在在加载数据之前做出延迟......使用

showProgress();
layoutHandler.postDelayed(mRunnable, 800);

我建议您使用savedInstanceState保存数据,而不是每次都加载数据。