android – Pushwoosh漏掉了我的活动

android – Pushwoosh漏掉了我的活动,第1张

概述我在我的应用程序中使用Pushwoosh来接收推送通知.我正在使用最新版本的Pushwoosh库3.1.14. 我有这样的屏幕结构. Login Activity -> Main Activity with multiple tabs. 所以我在MainActivity中实现了与pushwoosh相关的逻辑.我想从注销Logout取消注册,然后返回Login Activity. 我的代码如下.我已 我在我的应用程序中使用Pushwoosh来接收推送通知.我正在使用最新版本的Pushwoosh库3.1.14.

我有这样的屏幕结构.

Login Activity -> Main Activity with multiple tabs.

所以我在MainActivity中实现了与pushwoosh相关的逻辑.我想从注销logout取消注册,然后返回Login Activity.

我的代码如下.我已经过滤掉了与Pushwoosh无关的所有其他部分.坦率地说,这段代码与Pushwoosh文档here中的代码完全相似.唯一的区别在于onlogout()方法,我尝试从pushwoosh取消注册并返回LoginActivity.

Tabbaractivity.java

@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   //Pushwoosh Registration   registerReceivers();   PushManager pushManager = PushManager.getInstance(this);   pushManager.setNotificationFactory(new PushNotificationFactory());   try {       pushManager.onStartup(this);   } catch(Exception e) {}   //Register for push!   pushManager.registerForPushNotifications();   checkMessage(getIntent());} @OverrIDe protected voID onNewIntent(Intent intent) {    super.onNewIntent(intent);        setIntent(intent);        checkMessage(intent);}@OverrIDeprotected voID onResume() {        super.onResume();        registerReceivers();}@OverrIDeprotected voID onPause() {        super.onPause();        unregisterReceivers();}broadcastReceiver mbroadcastReceiver = new BaseRegistrationReceiver() {       @OverrIDe       public voID onRegisteractionReceive(Context context,Intent intent) {               checkMessage(intent);       }};private broadcastReceiver mReceiver = new BasePushMessageReceiver() {   @OverrIDe    protected voID onMessageReceive(Intent intent) {     //JsON_DATA_KEY contains JsON payload of push notification.       }};public voID registerReceivers() {  IntentFilter intentFilter = new IntentFilter(    getPackagename() + ".action.PUSH_MESSAGE_RECEIVE");  registerReceiver(mReceiver,intentFilter,getPackagename() +".permission.C2D_MESSAGE",null);      registerReceiver(mbroadcastReceiver,new IntentFilter(    getPackagename() + "." + PushManager.REGISTER_broAD_CAST_ACTION));}public voID unregisterReceivers() {  try {    unregisterReceiver(mReceiver);      } catch (Exception e) {    e.printstacktrace();      }  try {            unregisterReceiver(mbroadcastReceiver);  } catch (Exception e) {    e.printstacktrace();     }}private voID checkMessage(Intent intent) {  if (null != intent) {    if (intent.hasExtra(PushManager.REGISTER_EVENT)) {       uploadPushTokenToServer(PushManager.getPushToken(this));    }   resetIntentValues();      }}private voID resetIntentValues() {  Intent mainAppIntent = getIntent();  if (mainAppIntent.hasExtra(PushManager.PUSH_RECEIVE_EVENT)) {    mainAppIntent.removeExtra(PushManager.PUSH_RECEIVE_EVENT);      } else if (mainAppIntent.hasExtra(PushManager.REGISTER_EVENT)) {    mainAppIntent.removeExtra(PushManager.REGISTER_EVENT);  } else if (mainAppIntent.hasExtra(PushManager.UNREGISTER_EVENT)) {    mainAppIntent.removeExtra(PushManager.UNREGISTER_EVENT);  } else if (mainAppIntent.hasExtra(PushManager.REGISTER_ERROR_EVENT)) {    mainAppIntent.removeExtra(PushManager.REGISTER_ERROR_EVENT);  } else if (mainAppIntent.hasExtra(PushManager.UNREGISTER_ERROR_EVENT)) {    mainAppIntent.removeExtra(PushManager.UNREGISTER_ERROR_EVENT);  }  setIntent(mainAppIntent);}//Finally on logoutprivate voID onlogout() {   //other cleanup   //pushwoosh   PushManager.getInstance(this).unregisterForPushNotifications();   //goback to login activity}

我正在从服务器推送没有任何问题.我面临的唯一问题是在我注销并返回LoginActivity之后,Tabbaractivity仍保留在内存中,而后者又保留了许多其他片段和视图.我尝试使用MAT进行调试,这就是它所显示的内容.

Class name                                                                      | Ref. Objects | Shallow Heap | Ref. Shallow Heap | Retained Heap--------------------------------------------------------------------------------------------------------------------------------------------------com.pushwoosh.internal.request.RequestManager @ 0x12f89ce0  Thread-1737 Thread|            1 |           88 |               360 |           536'- val$context in.myproject.activitIEs.Tabbaractivity         @ 0x12d8ac40      |            1 |          360 |               360 |        18,520--------------------------------------------------------------------------------------------------------------------------------------------------

我还使用LeakCanary工具交叉检查相同,这也表明Pushwoosh正在坚持我的活动.

所以我的问题是,如何清理pushwoosh以避免我的活动泄露?

解决方法 通过简要地查看它们,您引用的文档就是一个示例,这些示例并不总是将API实现为具有其他活动的功能齐全的应用程序的最佳方式.我理解通过使用getInstance,你试图使用单例,但怀疑这不是很好管理.

我将控制在您的应用程序持续时间内使用的PushManager实例.

问题可能是从作用域创建了多个PushManager实例,并在类中创建了多个pushManager实例,并且可能在程序的生命周期内.这会导致泄漏.

我将pushManager作为一个类变量,而不是使用PushManager.getInstance两次,并考虑创建一个静态的PushManager实例,用于应用程序的持续时间,就像在整个应用程序中使用单个数据库实例一样.

在班级:

PushManager pushManager;

并在oncreate中初始化

pushManager = PushManager.getInstance(this);//Finally on logoutprivate voID onlogout() {    //other cleanup    //pushwoosh    // Here the first instance is left dangling.    // PushManager.getInstance(this).unregisterForPushNotifications();    pushManager..unregisterForPushNotifications();    //goback to login activity}

这样你就可以清理pushmanager的一个实例的资源.

要使用app wIDe静态PushManager:

static PushManager pushManager;

初始化为:

pushManager = new PushManager(this.getApplicationContext());

When is a Singleton not a Singleton?

总结

以上是内存溢出为你收集整理的android – Pushwoosh漏掉了我的活动全部内容,希望文章能够帮你解决android – Pushwoosh漏掉了我的活动所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1145266.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存