热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IntentService中的数据更改

如何解决《IntentService中的数据更改》经验,请问有没有懂的朋友?

我正在使用IntentService来处理来自FCM的推送通知的消息.它完美的要求,当消息出现一个接一个,但是当设备没有连接到网络,并在设备重新连接FCM发送大量邮件的同时,在这种情况下服务后导致一些模棱两可的同时处理意向数据,在调用Web服务时导致意外行为.

我的推送通知消息处理程序类:

public class PushMessageHandler extends FirebaseMessagingService {

private final static String TAG = "PushMessageHandler";

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    if (remoteMessage.getData() != null){
        Log.d(TAG, String.valueOf(remoteMessage.getData()));
        Intent notificatiOnService= new Intent(this, NotificationService.class);
        notificationService.putExtra(ResponseConstants.NOTIFICATION_FIELD,remoteMessage.getData().get(ResponseConstants.NOTIFICATION_FIELD));
        notificationService.putExtra(ResponseConstants.NOTIFICATION_DATA,remoteMessage.getData().get(ResponseConstants.NOTIFICATION_DATA));
        notificationService.putExtra(ResponseConstants.NOTIFICATION_TYPE,remoteMessage.getData().get(ResponseConstants.NOTIFICATION_TYPE));
        try {
            notificationService.putExtra(ResponseConstants.NOTIFICATION_IMAGE,remoteMessage.getData().get(ResponseConstants.NOTIFICATION_IMAGE));
            notificationService.putExtra(ResponseConstants.NOTIFICATION_TITLE, remoteMessage.getData().get(ResponseConstants.NOTIFICATION_TITLE));
        } catch (Exception e){
            Crashlytics.logException(e);
        }
        try {
            notificationService.putExtra(ResponseConstants.DATASETS,remoteMessage.getData().get(ResponseConstants.DATASETS));
        } catch (Exception e){
            Crashlytics.logException(e);
        }
        startService(notificationService);
    } else {
        Log.d(TAG, "Notification data is null");
    }
  }
}

我的通知处理程序服务类:

public class NotificationService extends IntentService implements NotificationContract.View {

@Inject
public NotificationPresenter mNotificationPresenter;

private NotificationContract.Presenter mPresenter;
private static final String TAG = "NotificationService";
private Intent mIntent;


public NotificationService() {
    super("NotificationService");
}

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    mIntent  = intent;
    DaggerNotificationPresenterComponent.builder()
            .notificationViewModule(new NotificationViewModule(this))
            .remoteDataSourceComponent(MyApplication.getInstance().providesRemoteDataSource())
            .localDataSourceComponent(MyApplication.getInstance().providesLocalDataSource())
            .build().inject(this);
 }

 @Override
 public synchronized void setPresenter(NotificationContract.Presenter presenter) {

this.mPresenter = presenter;

final String notificatiOnField= mIntent.getStringExtra(ResponseConstants.NOTIFICATION_FIELD);
Log.d(TAG, notificationField);

Handler handler = new Handler(getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        switch (notificationField.trim()){
            case Constants.NOTIFICATION_FIELD_CACHEHOMEFEEDS :
                mPresenter.prefetchData(Integer.parseInt(
                    mIntent.getStringExtra(ResponseConstants.NOTIFICATION_DATA)),
                    new JSONObject(mIntent.getStringExtra(ResponseConstants.DATASETS)));
                break;
            case Constants.NOTIFICATION_FIELD_UPDATEFEEDS :
                mPresenter.getPostDetailById(Integer.parseInt(
                    mIntent.getStringExtra(ResponseConstants.NOTIFICATION_DATA)),
                    new JSONObject(mIntent.getStringExtra(ResponseConstants.DATASETS)));
                break;
            case Constants.NOTIFICATION_FIELD_ARTICLES :
                mPresenter.getPostDetailsPostUrl(mIntent.getStringExtra(ResponseConstants.NOTIFICATION_DATA));
                break;
            case Constants.NOTIFICATION_FIELD_POSTDELETED :
                mPresenter.deleteFeed(Integer.parseInt(
                        mIntent.getStringExtra(ResponseConstants.NOTIFICATION_DATA)));
                break;
        }
    }
});
}

}

散装推送消息的情况下,我得到NOTIFICATION_DATA的互换价值即我预期的时候通知字段是"NOTIFICATION_FIELD_CACHEHOMEFEEDS"值"后:1234"和字段"NOTIFICATION_FIELD_ARTICLES"是"后:"后-URL'"但我收到"post:1234"提交"NOTIFICATION_FIELD_ARTICLES",该值在任何序列中都可以互换,取决于推送通知的消息调用.

根据IntentService的文档,以队列方式逐个处理请求.那么为什么会这样呢.有没有办法完美地处理这个问题.


推荐阅读
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
author-avatar
Missluckyyy_879
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有