iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android下Activity间通信序列化过程中深浅拷贝的示例分析
  • 195
分享到

Android下Activity间通信序列化过程中深浅拷贝的示例分析

androidactivity 2023-05-30 19:05:11 195人浏览 薄情痞子
摘要

这篇文章主要介绍了Android下Activity间通信序列化过程中深浅拷贝的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言问题的背景是,视频互动业务需要增加弹幕

这篇文章主要介绍了Android下Activity间通信序列化过程中深浅拷贝的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

问题的背景是,视频互动业务需要增加弹幕功能,但是播放器的视图是伪横屏的,即,他是一种类似于使用 rotate(90.0)的方式,旋转横屏的,在 Activity 层面上还是一个竖屏的状态。那么弹幕输入的时候的键盘,也是竖屏的。这会带来比较严重的用户体验问题。

由于屏幕旋转状态在 android 下,是一个 Activity 层面上的事情,而且相当的底层,无从 hook,多方调研以后,决定采拉起一个横屏的 Activity 作为键盘输入的专用 Activity。

这里的代码很快就可以写好,如下所示:

public class DialogActivity extends Activity { private RelativeLayout mContentView; private View vSendBtn; private EditText etDanmakuInput; private InputMethodManager mInputMethodManager; public static WeakReference<DanmakuWriteCallback> danmakuWriteCallback = new WeakReference<>(); @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  mInputMethodManager = (InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);  mContentView = (RelativeLayout) getLayoutInflater()    .inflate(R.layout.hiv_danmaku_input_dialog, null);  vSendBtn = mContentView.findViewById(R.id.tv_danmaku_send_btn);  etDanmakuInput = (EditText) mContentView.findViewById(R.id.et_danmaku_input);  vSendBtn.setOnClickListener(new OnClickListener() {   @Override   public void onClick(View v) {    // 这里需要处理 Activity 间回传逻辑   }  });  setContentView(mContentView);  showSofTKEyboard(); } private boolean showSoftKeyboard() {  if (this.etDanmakuInput == null) {   return false;  } else {   etDanmakuInput.postDelayed(new Runnable() {    public void run() {     etDanmakuInput.requestFocus();     mInputMethodManager.showSoftInput(etDanmakuInput, 0);    }   }, 100L);   return true;  } } @Override protected void onPause() {  super.onDestroy();  danmakuWriteCallback.getAndSet(null); } @Override public void finish() {  super.finish(); }}

DTO 的代码定义如下所示:

public class DanmakuDialogDTO implements Serializable { public WeakReference<DWDanmakuWriteController.DanmakuWriteCallback> callback; public Map<String, String> utExtraParams;}

那么现在问题来了,怎么把这个 Activity 获取到的 String 带回去?

最自然的想法是 onActivityResult,然而,播放器是一个 sdk,写不了 Activity 里的代码,也不可能通知许多业务方一一做改动。

那就只能抛开 android 原生的 Activity 间拉起结束中的通信机制了,思考其他可以通信的方法。很自然地,我们想到了 Callback 。结构如下图。但是 Callback 这样的一个非基本数据类型的对象怎么在 Activity 间传递呢?

Android下Activity间通信序列化过程中深浅拷贝的示例分析

尝试通过存入 Intent 的 Extras的方式,然而 putExtra 方法并不能 put 一个 object,只能 put 一个 serializable。那就让这个 DTO(Data Transfer Object)implements serializable 接口吧。没有问题。

然而无法启动 Activity,会有一个 crash 抛出:

java.lang.NullPointerException: Expected to unbox a 'int' primitive type but was returned null

报错堆栈如下:

$Proxy1.startActivity(Unknown Source)android.app.Instrumentation.execStartActivity(Instrumentation.java:1520)android.taobao.atlas.runtime.InstrumentationHook$2$1.execStartActivity(InstrumentationHook.java:299)

如果把这个 DTO 的成员变量改为 static 类型,则可以启动 Activity。

背后的原因是因为,在常规的序列化过程中,浅拷贝其实是没什么意义的。浅拷贝意味着复制一个引用的地址,是一个内存地址,但是常规序列化,要么跨进程,要么就是网络传输,序列化为 JSON,在这些常规场景里内存地址没有意义。因此 Java 序列化没有浅拷贝的选项,也往往是针对一个 POJO 或者 Bean 进行序列化,而不会对一个一般的含有很多引用的类进行序列化。

然而 Android 中的 Activity 与 Activity 间的传递对象又有所不同,理论上,都在同一个 Dalvik VM 中运行,相互的类引用都是可以访问到的。但是由于 Android Intent 设计为序列化传递,序列化过程中没有设计浅拷贝的机制,因此就无法浅拷贝地传递引用过去。

那么为什么设为 static 以后就可以传递,不会导致 crash 了呢?是因为静态成员属于类级别的,虽然不能序列化,但是因为我是在同一个机器(而且是同一个进程),我的JVM已经把这个类连带着他的静态变量一起加载进来了,所以获取到的是类层面上的静态变量地址,故,功能正常。

那么就决定是使用public static WeakReference<DWDanmakuWriteController.DanmakuWriteCallback> callback;了。但是事实上遇到了另一个问题:

在第一次 startActivity 的时候,观察到 Android 做了一次 GC,然后该 WeakReference 就被释放了,因此 Callback 的业务功能也不能正常执行。引入 WeakReference,原本是为了避开 static cakllback 导致的可能的内存泄漏,然而在这种主动 GC 的情况下,WeakReference 失效了。如果改用 SoftReference,和强引用并没有什么区别,都不能避免内存的泄漏。

最终,采用 AtomReference 来持有这个 static callback,在 Activity 退出的时机去将 AtomicReference 置空。之所以使用 AtomicReference,是因为考虑到视频 sdk 有并发场景的可能性,避免一边置 null 另一边准备使用的可能。

感谢你能够认真阅读完这篇文章,希望小编分享的“Android下Activity间通信序列化过程中深浅拷贝的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Android下Activity间通信序列化过程中深浅拷贝的示例分析

本文链接: https://www.lsjlt.com/news/220658.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android下Activity间通信序列化过程中深浅拷贝的示例分析
    这篇文章主要介绍了Android下Activity间通信序列化过程中深浅拷贝的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言问题的背景是,视频互动业务需要增加弹幕...
    99+
    2023-05-30
    android activity
  • js中深浅拷贝的示例分析
    这篇文章给大家分享的是有关js中深浅拷贝的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。js的深浅拷贝JavaScript的深浅拷贝一直是个难点,如果现在面试官让我写一个...
    99+
    2024-04-02
  • JavaScript中内存空间、赋值和深浅拷贝的示例分析
    这篇文章将为大家详细讲解有关JavaScript中内存空间、赋值和深浅拷贝的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JavaScript的内存空间在Java...
    99+
    2024-04-02
  • WebSocket中通信过程的示例分析
    小编给大家分享一下WebSocket中通信过程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是 WebSocket...
    99+
    2024-04-02
  • Python中进程间通信的示例分析
    这篇文章给大家分享的是有关Python中进程间通信的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。进程概述进程(Process)是计算机中已运行程序的实体。进程与程序不同,程序本身只是指令、数据及器组织形...
    99+
    2023-06-29
  • 微信小程序中缓存过期时间的示例分析
    小编给大家分享一下微信小程序中缓存过期时间的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!关于本地缓存1.wx.setStorage(wx.setStorageSync)、wx.g...
    99+
    2024-04-02
  • JS中promise化微信小程序api的示例分析
    这篇文章主要介绍JS中promise化微信小程序api的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!promise化的原因微信小程序的api用的是对象参数回调模式,很容易造...
    99+
    2024-04-02
  • 微信小程序中wxml列表渲染的示例分析
    这篇文章主要介绍微信小程序中wxml列表渲染的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!列表渲染存在的意义以电商为例,我们希望渲染5个商品,而又希望容易改变,我们就要在w...
    99+
    2024-04-02
  • 微信小程序webview与h5通过postMessage实现实时通讯的示例分析
    这篇文章给大家分享的是有关微信小程序webview与h5通过postMessage实现实时通讯的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在做 React Nativ...
    99+
    2024-04-02
  • 微信小程序中下拉刷新及上拉加载的示例分析
    小编给大家分享一下微信小程序中下拉刷新及上拉加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.下拉刷新的概念及应用...
    99+
    2024-04-02
  • 微信小程序实现通过双向滑动缩放图片大小的示例分析
    这篇文章主要介绍了微信小程序实现通过双向滑动缩放图片大小的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例讲述了微信小程序实现...
    99+
    2024-04-02
  • 微信小程序列表渲染功能之列表下拉刷新及上拉加载的示例分析
    小编给大家分享一下微信小程序列表渲染功能之列表下拉刷新及上拉加载的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图首...
    99+
    2024-04-02
  • 微信小程序中scroll-view实现上拉加载与下拉刷新的示例分析
    这篇文章主要为大家展示了“微信小程序中scroll-view实现上拉加载与下拉刷新的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中scrol...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作