gpt4 book ai didi

java - 如何制作 Activity 来显示从服务获取的数据?

转载 作者:行者123 更新时间:2023-12-02 11:03:57 26 4
gpt4 key购买 nike

我需要编写一个服务,每 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);
}
}

最佳答案

您之所以遇到此问题,是因为您的存储库实现不正确。

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

如果您检查NetworkBoundResource的代码,诀窍在于您有一个 LiveData,它将从网络加载和从数据库加载的能力绑定(bind)在一起。

就您而言,只要您有网络访问权限,您就会替换数据库的自动更新查询结果 - 这就是您无法更新 MainActivity 的原因。

最简单的方法(不使用 MediatorLiveData)是在 Repository 上有两个单独的函数:一个用于 fetchFromNetwork,另一个用于 fetchFromDatabase。 MainActivity 应始终从数据库获取,而 Service 始终触发来自网络的加载(并通过 Dao 将其直接插入数据库)。

这样,当Service在后台线程将数据插入DB时,MainActivity中的observe函数就会收到最新的数据。

关于java - 如何制作 Activity 来显示从服务获取的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com