【发布时间】:2018-07-01 09:53:17
【问题描述】:
我需要编写一个服务,该服务将每 30 秒更新一次 MainActivity 中的列表。我将 MVVM 与 ViewModel 和 LiveData 一起使用,因此我的 Service 类如下所示:
public class ArticleJobService extends JobService {
public static String TAG = "ArticleJobService";
private Context context = this;
@Override
public boolean onStartJob(JobParameters jobParameters) {
Log.d(TAG, "onStartJob");
MainActivity.PAGE_NUMBER++;
LiveData<List<Article>> liveArticles = ArticleRepository.getInstance(getApplication()).getArticles(MainActivity.PAGE_NUMBER);
liveArticles.observeForever(new Observer<List<Article>>() {
@Override
public void onChanged(@Nullable List<Article> articles) {
Log.d(TAG, "onStartJob - onChanged!!!!!!");
liveArticles.removeObserver(this);
NotificationUtils.showNotification(context, articles.get(0).getSectionName(), articles.get(0).getWebTitle());
jobFinished(jobParameters, true);
}
});
return true;
}
}
我的通知类:
public static void showNotification(Context context, String section, String title) {
PendingIntent contentPendingIntent = PendingIntent.getActivity
(context, REQUEST_CODE, new Intent(context, MainActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);
NotificationManager manager =
(NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
manager.createNotificationChannel(createNotificationChannel(context));
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
.setContentTitle(section)
.setContentText(title)
.setContentIntent(contentPendingIntent)
.setSmallIcon(R.drawable.app_icon)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setAutoCancel(true);
manager.notify(0, builder.build());
}
当 JobService 中的 Onchanged 起作用时,我会得到列表并显示通知。通知会打开 MainActivity,它会像往常一样对 api 进行新的调用。为了让 MainActivity 显示我从服务中获得的列表,我必须进行哪些更改???我真的不能把它绑在一起。 我听说过 IPC,但不会那样做,我想要一些我确实存在但我不知道的更简单的做法。 另外,有两种情况:通知来了并且 MainActivity 已打开,应用程序已打开但 MainActivity 不在前台,应用程序在后台或关闭。我应该如何处理这些情况?
另见 MainActivity onCreate 中的一段代码:
mArticleViewModel = ViewModelProviders.of(this).get(ArticleViewModel.class);
mArticleViewModel.getArticleList(PAGE_NUMBER).observe(this, articles -> {
Log.d(TAG, "List<Result> onChanged!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
mProgressBar.setVisibility(View.GONE);
mProgressBarMain.setVisibility(View.GONE);
mIsLoading = false;
mArticles = articles;
请提供此任务的最佳实践,我知道这很常见,我只是第一次做,而使用 LiveData 会使它变得更加复杂。
这里也是存储库代码:
public static ArticleRepository getInstance(Application application){
if(INSTANCE == 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 = db.articleDao();
}
public LiveData<List<Article>> getArticles(int page) {
Log.d(TAG, "getArticles");
if (NetworkUtils.isOnline(mContext)) {
Log.d(TAG, "isOnline");
mArticles = loadFromNetwork(page);
} else {
Log.d(TAG, "is NOT Online");
mArticles = loadFromDB(page);
}
}
【问题讨论】:
-
I use MVVM with ViewModel and LiveData and so my Service class looks like this:我完全不明白为什么你的服务类看起来像那样 -
如果我能做得更好,我不会问这个问题并寻求建议,所以要么提出建议和更正,要么非常具体,要么不要发表任何评论
-
我的意思是,除了获取服务中的项目列表之外,您的服务究竟做了什么,然后显示通知?我想“更新列表”意味着获取写入 Room 的数据,一旦完成,订阅
LiveData<List<T>>将自动更新列表,而无需在后台线程上执行任何操作。您的要求不明确。 -
所以要求是运行后台服务,每 30 秒从 web 服务获取数据并显示通知,打开通知显示更新的主屏幕。我的服务现在所做的只是从服务器获取数据,我不明白如何将它与 MainActivity 绑定。关于房间,它不是我的应用程序中的事实来源,我在插入带有 LiveData 的房间时遇到问题,所以我使用带有通用列表的房间,我将提供 repo 代码
-
编辑问题并添加回购代码
标签: java android kotlin android-livedata android-mvvm