2016-01-16 4 views
0

У меня проблема, которая появляется только после нескольких часов бездействия, я исследовал ее, пытаясь исправить различные способы ее устранения. Проблема заключается в том, что мое приложение неактивно в течение нескольких часов, однако ссылки на мои фрагменты не равны нулю; они все еще существуют в менеджере фрагментов. Я использую ссылки, чтобы вытащить тег, или id, используя findfragmentby ...(), поэтому я могу вызывать конкретные методы внутри них для обновления самих себя, а что нет. Фрагменты являются динамическими и имеют пользовательский интерфейс. У меня есть несколько видов деятельности и службы, которые вызываются основным видом деятельности. Я могу закрыть приложение и возобновить, вызвать действия, вывести информацию из службы, закрыть, использовать кнопку «Назад», без проблем. Чтобы дать вам представление о том, как структурирована приложение ...ссылка ссылки null на резюме

public class appClass extends Application { 
public Fragment fragmentA; 
public Fragment fragmentB; 
public Fragment fragmentC; 
@Override 
public void onCreate() { 
    super.onCreate(); 
    new fragmentTemplate(); 
    fragemntA = fragmentTemplate.newInstance(getDbName(), usefuldata, "A List"); 
    new fragmentTemplate(); 
    fragemntB = fragmentTemplate.newInstance(getDbName(), usefuldata, "B list"); 
    new fragmentTemplate(); 
    fragemntC = fragmentTemplate.newInstance(getDbName(), usefuldata, "C list"); 

     } 
} 

Переходя к деятельности, где фрагменты используются в viewager ...

public class mainActivity extends AppCompatActivity implements ...listeners{ 
    appClass myAppClass; 
    FragmentManager FragMgr; 
    ViewPager viewPager; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     myAppClass = (appClass) getApplication(); 
     setTheme(myAppClass.getAppTheme()); 
     setContentView(R.layout.activity_my_layout); 
     //toolbar actionbar stuff 
     FragMgr = getSupportFragmentManager(); 

     viewPager = (ViewPager) findViewById(R.id.viewpager); 
     viewPager.setAdapter(new ViewPagerAdapter(FragMgr)); 

     //tab setup 

    } 
    //inner class pager adapter is here 
} 

Это мой пейджер адаптер

class ViewPagerAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener{ 
     Fragment fragment; 


     public ViewPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        if (myAppClass.fragmentA != null) { 
         fragment = myAppClass.fragemntA ; 
        } 
        break; 
       case 1: 
        if (myAppClass.fragmentB != null) { 
         fragment = myAppClass.fragmentB ; 
        } 
        break; 
       case 2: 
        if (myAppClass.fragmentC != null) { 
         fragment = myAppClass.fragmentC ; 
        } 
        break; 
      } 

      return fragment; 
     } 
     @Override 
     public int getCount() { 
     return 3; 
     } 
} 

у меня есть FAB и его слушатель выглядит следующим образом

@Override 
    public void onClick(View v) { 
     Fraggment fragment; 
     int i = viewPager.getCurrentItem(); 
     if (v.getId() == floatingActionButton.getId()) { 

      switch (i) { 
       case 0: 
        fragment= (Fragment) FragMgr.findFragmentByTag(myAppClass.fragmentA.getTag()); 
        fragment.addItem(fragment.getSomeString()); 
        break; 
       case 1: 
        fragment= (Fragment) FragMgr.findFragmentByTag(myAppClass.fragmentB.getTag()); 
        fragment.addItem(fragment.getSomeString()); 
        break; 
       case 2: 
        fragment= (Fragment) FragMgr.findFragmentByTag(myAppClass.fragmentC.getTag()); 
        fragment.addItem(fragment.getSomeString()); 
        break; 
      } 

     } 
    } 

код фрагмента

public class fragmentTemplate extends Fragment implements RecyclerAdapter.aListener { 

    private appClass myAppclassReference; 
    private RecyclerView recyclerView; 
    private View view; 
    private FragmentTitle; 

    public static fragmentTemplate newInstance(String a, String b, String c) { 

     Bundle args = new Bundle(); 
     args.putString(KEY_A, a); 
     args.putString(KEY_B, b); 
     args.putString(KEY_C, c); 
     fragmentTemplate fragment = new fragmentTemplate(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public String getFragmentTitle() { 
     return fragmentTitle; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, final Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.list, container, false); 
     myAppclassReference= ((appClass) getActivity().getApplication()); 
     recyclerView = (RecyclerView) view.findViewById(R.id.listView); 
     //get list is a local function that loads a list from a db source 
     RecyclerAdapter recycler = new RecyclerAdapter(getActivity(), getList()); 
     recycler.setListener(this); 
     recyclerView.setAdapter(recycler); 
     recyclerView.setLayoutManager(newLearLayoutManager(getActivity())); 
     recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {}}; 
     return view; 
     } 
} 

Когда дела идут шаткий приложение не врезаться сразу, вкладки еще Улитка, ViewPager еще прокручивается, но она пуста, ее пока я не попал в FAB я получаю исключение nullpointerexception, пытаясь вызвать метод на ссылке nullpointer внутри onClick Listener, действительно ли он сбой.

ответ

0

Это происходит потому, что вы возитесь с тем, как Android Framework обрабатывает фрагменты для вас. Когда ViewPagerAdapter получает фрагменты из вас в getItem(int), он использует FragmentManager, который вы ему дали, чтобы присоединить Фрагменты. Когда активность будет убита из-за низкой памяти, FragmentManager автоматически создаст новые экземпляры ваших фрагментов. На данный момент есть две копии фрагментов, созданные FragmentManager, и те, которые вы воссоздали в своем appClass.

Вы никогда не должны ссылаться на свои фрагменты. FragmentManager может уничтожить их и создать новые. Если вам необходимо установить связь между Activity и Fragments в ViewPager, вы можете либо сделать Fragment запросить его действие для команд, использовать Event Bus, либо исследовать отрывочные решения here.

Смежные вопросы