我用空间实现了缓存但由于某种原因它被破坏了,要么它没有插入或者没有得到数据,我已经做了很多调试但是仍然没有任何线索......有人可以帮忙吗?那么,图片如下:
主要活动
mArticleViewModel = ViewModelProviders.of(this).get(ArticleViewModel.class);
mArticleViewModel.getArticleList(mPageNumber).observe(this, articles
-> { /* doesn't matter */ });
Run Code Online (Sandbox Code Playgroud)视图模型
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)
}
知识库
public class ArticleRepository {
public static final String TAG = "ArticleRepository"; …
Run Code Online (Sandbox Code Playgroud)在阅读 Kotlin 泛型类型变化和投影时,我想到了一个完全陌生的概念。有人可以解释一下作者想要解释的想法是什么吗?请引用来自Kotlin in Action, MEAP 的引用:
获得out
已经有out
变化的类型参数的投影是没有意义的,例如List<out T>
。这意味着与 相同List<T>
,因为List
被声明为class List<out T>
。Kotlin 编译器会警告这样的投影是多余的。
这里有两个具体问题:
LiveData setValue 应该触发了 Activity 中的 onChanged 方法,但是它仅在第一次调用,在我尝试进行分页之后,它会中断并且不再调用 onChanged,尽管我的响应确实成功并且我在日志。setValue/postValue 有什么问题?这是一个错误吗?我应该自己实现观察者模式吗?那么使用 LiveData 有什么意义呢?我的寻呼不仅仅适用于这已经 2-3 天了.....
主活动类
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)出于某种原因,我的单例存储库是从后台线程多次创建的,但是,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) 我正在阅读并试图理解 Kotlin 类型的预测,有时我会想出这样令人困惑的事情:
对于逆变类型参数,例如
Consumer<in T>
,星形投影等效于<in Nothing>
。实际上,您不能调用具有T
此类星形投影签名的任何方法。 如果类型参数是逆变的,则它仅充当消费者,并且正如我们之前讨论的那样,您并不确切知道它可以消耗什么。因此,你不能给它任何东西来消费。当有关类型参数的信息不重要时,您可以使用星形投影语法:您不使用任何引用签名中类型参数的方法,或者您只读取数据而不关心其特定类型。例如,您可以将
printFirst
函数List<*>
作为参数来实现。
具有星形投影的逆变类型是什么意思,它是如何实现的