Android: экземпляр синглтона не мусор после закрытия приложения - PullRequest
0 голосов
/ 26 мая 2019

У меня активность андроида с фрагментом.

Во фрагменте я выбираю данные, используя модификацию, и устанавливаю статический флаг, чтобы при повторном переходе к этому фрагменту я снова ограничивал выборку данных.

Я также храню данные в одноэлементном экземпляре.

Но даже после того, как я уничтожил действие / закрыл приложение, статический флаг и экземпляр все еще доступны, и списоктакже присутствуют в экземпляре, который неисправности моего приложения.

Но я хочу, чтобы экземпляр создавался заново и получать данные при каждом запуске.

Этомой экземпляр синглтона.

public class Utilities {

    private static Utilities utils = null;

    private List<Data> friendsList;

    public List<Data> getDataList() {
        return dataList;
    }

    public void setDataList(List<Data> dataList) {
        this.dataList = dataList;
    }

    private List<Data> dataList;

    public synchronized static Utilities getInstance(){

        if(utils == null){
            utils = new Utilities();
        }
        return utils;
    }
}

Это мой фрагмент:

public class DataFragment extends Fragment
{
    private static boolean hasObtainedData;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)  {

        if(!hasObtainedData){
            getData(v);
        }else{
           recyclerView.setAdapter(new Adapter(utils.getDataList()));
         }
     }

     private void getData(View v) {

         //get Data using Retrofit:
         hasObtainedData = true;
         utils.setDataList(dataListObtainedUsingRetrofit)
         recyclerView.setAdapter(new Adapter(utils.getDataList()));
    } 
}

Вот как я называю свой фрагмент из MainActivity:

@Override
public void onTabSelected(TabLayout.Tab tab) {
           getSupportFragmentManager().beginTransaction()
                            .replace(R.id.fragmentBox, new DataFragment()).commit();
    }    

Я попытался датьSystem.gc () в onDestroy () MainActivity, но, тем не менее, экземпляр-одиночка жив.

Я ищу много сообщений SOF, основываясь на этом, но не смог решить эту проблему.

Любая помощь будет очень полезна.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019

Ваш синглтон не выдержит прекращения работы вашего приложения, и, вероятно, происходит то, что вы фактически не убиваете приложение полностью во время своих тестов. Запустите adb shell am force-stop <your-app-package> с консоли и посмотрите, не приведет ли это к проблеме.

С учетом вышесказанного, если вы хотите, чтобы ваши данные запускались только один раз при запуске приложения, то я бы порекомендовал вам переместить их в обратный вызов жизненного цикла onCreate() вашего Application

public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        //Begin process to fetch data and cache it here
    }
}

Не забудьте также добавить имя приложения в манифест, <application android:name="your.packagename.App"

Тогда вам вообще не нужно изменять ваши данные - они будут запускаться только один раз при запуске приложения.

Если, однако, вы действительно хотите, чтобы ваши данные обновлялись каждый раз при запуске Activity, тогда выполните тот же процесс, что и раньше, но внутри onCreate() вашей Деятельности. Вы также можете очистить его в onDestroy(), если вы хотите, чтобы оно обновлялось при воссоздании вашей активности:

@Override
public void onDestry() {
    super.onDestroy();
    Utilities.getInstance().setDataList(null);
}

Кроме того, если ваши данные связаны с жизненным циклом вашей Деятельности, то вам на самом деле не нужен синглтон (который связан с жизненным циклом приложения).

0 голосов
/ 26 мая 2019

Указатель на Singleton является статическим в самом Utilities-Class, поэтому Singelton никогда не будет доступен для GC, если вы не установите utils = null при выходе из MainAcitivity с чем-то вроде

Utilities.reset();
...