Ошибка переполнения стека в архитектуре репозитория MVVM - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу реализовать MVVM, используя Room db для моего приложения. Я перешел по этой ссылке https://codelabs.developers.google.com/codelabs/android-room-with-a-view/index.html?index=..%2F..index#13

Я получил ошибку при создании экземпляра модели представления. Когда я решил, что у меня появилась новая ошибка, как показано ниже:

     Process: com.example.dailyfaithapp, PID: 7341
    java.lang.StackOverflowError: stack size 8192KB
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
2020-04-28 18:10:23.865 7341-7341/com.example.dailyfaithapp E/AndroidRuntime:     at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
2020-04-28 18:10:29.491 7341-7356/com.example.dailyfaithapp I/e.dailyfaithap: Background concurrent copying GC freed 395507(38MB) AllocSpace objects, 1(3804KB) LOS objects, 5% free, 95MB/101MB, paused 337us total 142.457ms
2020-04-28 18:10:29.720 7341-7341/com.example.dailyfaithapp I/chatty: uid=10141(com.example.dailyfaithapp) identical 8100 lines
2020-04-28 18:10:29.720 7341-7341/com.example.dailyfaithapp E/AndroidRuntime:     at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
2020-04-28 18:10:29.720 7341-7341/com.example.dailyfaithapp E/AndroidRuntime:     at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.Repositories.FavouriteRepository.getAllFavourites(FavouriteRepository.java:25)
        at com.example.dailyfaithapp.ViewModels.FavouritesViewModel.<init>(FavouritesViewModel.java:26)
        at com.example.dailyfaithapp.FavouritesViewModelFactory.create(FavouritesViewModelFactory.java:25)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
        at com.example.dailyfaithapp.Activities.FavouritesActivity.setUpUI(FavouritesActivity.java:72)
        at com.example.dailyfaithapp.Activities.FavouritesActivity.onCreate(FavouritesActivity.java:54)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Я попытался увеличить размер кучи проекта, это максимальное значение, которое я могу увеличить

org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M"

Здесь мой взгляд модель

public class FavouritesViewModel extends AndroidViewModel {

        public FavouriteRepository mRepository;

        public LiveData<List<Favourites>> mAllFavourites;
        private MutableLiveData<List<Favourites>> favouriteSearchResults;

        public FavouritesViewModel (Application application) {
                super(application);
                mRepository = new FavouriteRepository(application);
                mAllFavourites = mRepository.getAllFavourites();
                favouriteSearchResults = mRepository.getFavouritesSearch();
        }
        public LiveData<List<Favourites>> getmAllFavourites() { return mAllFavourites; }

}

Репозиторий

public class FavouriteRepository {

    private MutableLiveData<List<Favourites>> favouritesSearch =
            new MutableLiveData<>();

    private LiveData<List<Favourites>> allFavourites;

    public LiveData<List<Favourites>> getAllFavourites() {
        return getAllFavourites();
    }

    public MutableLiveData<List<Favourites>> getFavouritesSearch() {
        return getFavouritesSearch();
    }
}

Просмотр фабрики моделей

public class FavouritesViewModelFactory implements ViewModelProvider.Factory {
    private Application mApplication;
    private String mParam;


    public FavouritesViewModelFactory(Application application) {
        mApplication = application;
    }


    @Override
    public <T extends ViewModel> T create(Class<T> modelClass) {
        return (T) new FavouritesViewModel(mApplication);
    }
}

База данных

@Database(entities = {Favourites.class}, version = 1, exportSchema = false)
public  abstract class FavouritesDatabase extends RoomDatabase {

        public abstract FavouritesDAO favouritesDAO();

        private static FavouritesDatabase INSTANCE;

        public static FavouritesDatabase getFavouritesDatabase(final Context context) {
            if (INSTANCE == null) {
                synchronized (FavouritesDatabase.class) {
                    if (INSTANCE == null) {
                        INSTANCE =
                                Room.databaseBuilder(
                                        context.getApplicationContext(),
                                        FavouritesDatabase.class,
                                        "favourites_database"
                                ).build();
                    }
                }
            }
            return INSTANCE;
        }
}

DAO

@Dao
public interface FavouritesDAO {

        @Query("SELECT * FROM favourites")
        LiveData<List<Favourites>> getAllFavourites();

        @Query("SELECT * FROM favourites")
        List<Favourites> loadAllFavorites();

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        void insertAllFavourites(Favourites... favourites);

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        public void insertFavourite(Favourites favourites);

        @Delete
        void delete(Favourites favourites);
}

Во время отладки я увидел, что метод getAllFavourites () из хранилища вызывается непрерывно, и из-за того, что память переполняется.

Вот мое действие,

    public void setUpUI(){

        recyclerView = findViewById(R.id.recycler_view_favourites);
        constraintLayoutEmpty = findViewById(R.id.constraint_empty);
        imageViewBack = findViewById(R.id.imageView_back);

        imageViewBack.setOnClickListener(this);



        favouritesViewModel = new ViewModelProvider(this,
                new FavouritesViewModelFactory(getApplication())).get(FavouritesViewModel.class);


        favouritesViewModel.getmAllFavourites().observe(this,
                new Observer<List<Favourites>>() {
            @Override
            public void onChanged(@Nullable final List<Favourites> products) {

                favouritesArrayList = products;
            }
        });
}

setUpUI вызывается при создании действия.

Пожалуйста, помогите. Спасибо.

1 Ответ

2 голосов
/ 28 апреля 2020

В FavouriteRepository вы делаете:

public LiveData<List<Favourites>> getAllFavourites() {
    return getAllFavourites();
}

Этот метод вызывает сам себя. Вы должны увидеть, что вам нужно, чтобы получить здесь вместо того, чтобы вызывать себя.

Я думаю, у вас та же проблема в следующем методе:

public MutableLiveData<List<Favourites>> getFavouritesSearch() {
    return getFavouritesSearch();
}

Вам нужно исправить это.

...