小编sun*_*r20的帖子

为什么Android Room插入不起作用?

我用空间实现了缓存但由于某种原因它被破坏了,要么它没有插入或者没有得到数据,我已经做了很多调试但是仍然没有任何线索......有人可以帮忙吗?那么,图片如下:

  1. 主要活动

    mArticleViewModel = ViewModelProviders.of(this).get(ArticleViewModel.class);
    mArticleViewModel.getArticleList(mPageNumber).observe(this, articles 
    -> { /* doesn't matter */ });
    
    Run Code Online (Sandbox Code Playgroud)
  2. 视图模型

    public class ArticleViewModel extends AndroidViewModel {
    
        public static final String TAG = "ArticleViewModel";
        private LiveData<List<Article>> articleList;
        private ArticleRepository articleRepository;
    
        public ArticleViewModel(@NonNull Application application) {
            super(application);
            Log.d(TAG, "ArticleViewModel");
            if (articleRepository == null) {
                articleRepository = new ArticleRepository(application);
            }
        }
    
    
        public LiveData<List<Article>> getArticleList(int pageNumber) {
            Log.d(TAG, "getArticleList");
            articleList = articleRepository.getArticles();
            return articleList;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

  3. 知识库

    public class ArticleRepository {
            public static final String TAG = "ArticleRepository"; …
    Run Code Online (Sandbox Code Playgroud)

android kotlin android-room android-livedata

7
推荐指数
1
解决办法
3921
查看次数

Kotlin 投影冗余

在阅读 Kotlin 泛型类型变化和投影时,我想到了一个完全陌生的概念。有人可以解释一下作者想要解释的想法是什么吗?请引用来自Kotlin in Action, MEAP 的引用:

获得out已经有out变化的类型参数的投影是没有意义的,例如List<out T>。这意味着与 相同List<T>,因为List被声明为class List<out T>。Kotlin 编译器会警告这样的投影是多余的。

这里有两个具体问题:

  1. 为什么您需要在已经输出的投影类型列表上添加投影?
  2. 即使你这样做了,你怎么得到同样的List?

java generics kotlin

6
推荐指数
1
解决办法
758
查看次数

为什么 LiveData setValue 或 PostValue 在视图中只触发一次 onChange?

LiveData setValue 应该触发了 Activity 中的 onChanged 方法,但是它仅在第一次调用,在我尝试进行分页之后,它会中断并且不再调用 onChanged,尽管我的响应确实成功并且我在日志。setValue/postValue 有什么问题?这是一个错误吗?我应该自己实现观察者模式吗?那么使用 LiveData 有什么意义呢?我的寻呼不仅仅适用于这已经 2-3 天了.....

  1. 主活动类

     public class MainActivity extends AppCompatActivity 
     private MutableLiveData<List<Photo>> mLivePhotos;
     // some code...
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
        mLivePhotos = loadData();
        mLivePhotos.observe(this, photos -> {
            Log.d(TAG, "onChanged!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
            mProgressBar.setVisibility(View.GONE);
            mPhotos = photos;
            if (mIsInitialCall) {
                initiateAdapter();
                mIsInitialCall = false;
            } else {
                mAdapter.updateList(mPhotos.subList(mPageNumber, mPageNumber + 10));
            }
        });
    
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                int lastPosition = 
    mLayoutManager.findLastCompletelyVisibleItemPosition();
                Log.d(TAG, "onScrolled - …
    Run Code Online (Sandbox Code Playgroud)

java android kotlin android-livedata android-paging

5
推荐指数
2
解决办法
9637
查看次数

为什么我的Singleton是同步的,但是它被多次创建?

出于某种原因,我的单例存储库是从后台线程多次创建的,但是,synchronized应该有帮助.有人可以帮忙吗?如果需要,我将提供代码片段和github链接.

我的IntentService类:

  @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.d(MainActivity.TAG, "ArticleIntentService - onHandleIntent");


        LiveData<List<Article>> liveArticles = ArticleRepository.getInstance(getApplication())
                .loadFromNetwork(PAGE_NUMBER, PAGE_SIZE);
        PAGE_NUMBER++;
        liveArticles.observeForever(articles -> {
            Log.d(MainActivity.TAG, "onStartJob - onChanged!!!!!!");
//                liveArticles.removeObserver(this);
            NotificationUtils.showNotification(context, articles.get(0).getSectionName(), articles.get(0).getWebTitle());

        });

    }
Run Code Online (Sandbox Code Playgroud)

我的存储库:

public static ArticleRepository INSTANCE;

public static synchronized ArticleRepository getInstance(Application application){
    if(INSTANCE == null){
        Log.d(TAG, "ArticleRepository getInstance is NULL");
        return  new ArticleRepository(application);
    }

    return INSTANCE;
}

private ArticleRepository(Application application) {
    Log.d(TAG, "ArticleRepository constructor");
    mContext = application;
    mArticles = new MutableLiveData<>();
    ArticleRoomDatabase db = ArticleRoomDatabase.getInstance(application);
    mArticleDao = …
Run Code Online (Sandbox Code Playgroud)

java android kotlin android-intentservice android-livedata

0
推荐指数
1
解决办法
61
查看次数

Kotlin 对逆变类型的星形投影

我正在阅读并试图理解 Kotlin 类型的预测,有时我会想出这样令人困惑的事情:

对于逆变类型参数,例如Consumer<in T>,星形投影等效于<in Nothing>。实际上,您不能调用具有T此类星形投影签名的任何方法。 如果类型参数是逆变的,则它仅充当消费者,并且正如我们之前讨论的那样,您并不确切知道它可以消耗什么。因此,你不能给它任何东西来消费。

当有关类型参数的信息不重要时,您可以使用星形投影语法:您不使用任何引用签名中类型参数的方法,或者您只读取数据而不关心其特定类型。例如,您可以将printFirst函数List<*>作为参数来实现。

具有星形投影的逆变类型是什么意思,它是如何实现的

java generics types kotlin type-projection

-1
推荐指数
2
解决办法
1198
查看次数