簡體   English   中英

存儲庫 MVVM 架構中的堆棧溢出錯誤

[英]Stack Overflow error in Repository MVVM architecture

我想在我的應用程序中使用 Room db 實現 MVVM。 我點擊了這個鏈接https://codelabs.developers.google.com/codelabs/android-room-with-a-view/index.html?index=..%2F..index#13

我在創建視圖 model 的實例時遇到錯誤。 正如我解決的那樣,我最終遇到了如下新錯誤:

     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"

這是我的看法 model

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();
    }
}

查看Model工廠

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
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() 被連續調用,因為 memory 已滿。

這是我的活動,

    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 在活動的 onCreate 上調用。

請幫忙。 謝謝你。

FavouriteRepository你正在做:

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

此方法是否在調用自身。 你必須看看你需要什么才能到達這里而不是調用它自己。

我認為您在下一個方法中遇到了同樣的問題:

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

你需要修復這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM