`
zheyiw
  • 浏览: 1019977 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android_java_handle的弱引用

阅读更多
在使用handle的时候提示使用static否则会内存泄漏,可以使用弱引用解决

当Activity finish后,延时消息会继续存在主线程消息队列中1分钟,然后处理消息。而该消息引用了Activity的Handler对象,然后这个Handler又引用了这个Activity。这些引用对象会保持到该消息被处理完,这样就导致该Activity对象无法被回收,从而导致了上面说的 Activity泄露。

WeakReference与SoftReference都可以用来保存对象的实例引用,这两个类与垃圾回收有关。
WeakReference是弱引用,其中保存的对象实例可以被GC回收掉。这个类通常用于在某处保存对象引用,而又不干扰该对象被GC回收,通常用于Debug、内存监视工具等程序中。因为这类程序一般要求即要观察到对象,又不能影响该对象正常的GC过程。
最近在JDK的Proxy类的实现代码中也发现了Weakrefrence的应用,Proxy会把动态生成的Class实例暂存于一个由Weakrefrence构成的Map中作为Cache。

SoftReference是强引用,它保存的对象实例,除非JVM即将OutOfMemory,否则不会被GC回收。这个特性使得它特别适合设计对象Cache。对于Cache,我们希望被缓存的对象最好始终常驻内存,但是如果JVM内存吃紧,为了不发生OutOfMemoryError导致系统崩溃,必要的时候也允许JVM回收Cache的内存,待后续合适的时机再把数据重新Load到Cache中。这样可以系统设计得更具弹性。

private static class MainHandler extends Handler {
	private final WeakReference<BaseScanActivity> weakReference;
	BaseScanActivity activity;

	public MainHandler(BaseScanActivity activity) {
		weakReference = new WeakReference<BaseScanActivity>(activity);
		activity = weakReference.get();
	}

	@Override
	public void handleMessage(Message msg) {
		switch (msg.what) {
		case HadwareControll.BARCODE_READ: {
			activity.onBarcodeRead(msg.obj + "\n");
			break;
		}
		}
	};
}
分享到:
评论

相关推荐

    Android开发—AndroidUI设计技巧.pdf

    &lt;item android:state_window_focused="false" android:drawable="@drawable/handle_normal"/&gt; &lt;item android:state_focused="true" android:drawable="@drawable/handle_focused"/&gt; &lt;item android:state_pressed=...

    Android学习笔记(二四):多页显示SlidingDrawer的使用.doc

    `handle`和`content`的ID需要与XML中的声明相匹配,以便在代码中正确引用。 SlidingDrawer有多种操作方法: - `open()`:打开抽屉。 - `close()`:关闭抽屉。 - `toggle()`:根据当前状态打开或关闭抽屉。 - `...

    SlidingDrawer抽屉效果可以默认显示一部分。

    android:handle="@+id/handle" android:content="@+id/content" android:orientation="vertical" android:visibility="visible"&gt; android:id="@id/handle" android:layout_width="wrap_content" android:...

    Android Studio 使用BottomNavigationView 实现底部 tabs (二)

    这里,`app:menu`属性引用了菜单资源文件,我们将用它来定义底部导航项。 接下来,创建一个名为bottom_navigation_menu.xml的菜单资源文件,放在res/menu目录下。在这个文件中,为每个tab定义一个菜单项: ```xml ...

    android slidingdrawer实例

    - `android:handle`:引用handle视图的ID。 - `android:content`:引用content视图的ID。 - `android:openGravity`和`android:closeGravity`:分别定义打开和关闭时content的位置,如"top"、"bottom"、"left"、...

    android usb转串口源码

    将库项目添加到Android项目中,或者在build.gradle文件中引用它。 2. 初始化串口: 首先,需要找到并打开对应的USB设备,然后创建SerialPort对象来处理串口通信。 ```java UsbDevice device = ...; UsbDevice...

    知识共享-android之slidingdrawer的应用(雷惊风).

    通过对给定的XML布局和Java代码的分析,我们深入了解了如何在Android项目中集成和控制`SlidingDrawer`,以及如何利用它来增强用户体验。这种组件特别适合于那些需要在不破坏主要UI布局的前提下,提供额外功能或信息...

    Android系统中基于Binder的IPC流程框架分析

    这个引用对象的Handle会被保存在ServiceManager中,并与Service组件的名字对应。Service组件分为Java层和C++(Native层)两种,但它们的本质都是为了向其他进程提供服务。 当Client组件需要使用Service组件提供的...

    用java实现安卓handler消息机制

    本教程将详细讲解如何使用Java语言来实现Android的Handler消息机制,包括其基本原理、创建步骤以及如何实现跨线程通信和发送延迟消息。 一、Handler基本原理 Handler是Android系统提供的一个用于处理线程间通信的...

    仿微信底部和顶部菜单栏

    在Android应用开发中,创建一个类似微信的底部和顶部菜单栏是常见的需求,这不仅可以提供良好的用户界面(UI)设计,还能确保用户能够方便地访问主要功能。微信的菜单栏设计已经成为移动应用的一种典范,因此许多...

    基于android背景选择器selector的用法汇总

    &lt;item android:drawable="@drawable/handle_normal" android:state_enabled="true" android:state_window_focused="false"/&gt; &lt;!-- 触摸模式按下时的背景图片 --&gt; &lt;item android:drawable="@drawable/handle_...

    android UI进阶之android中隐藏的layout 抽屉的使用方法

    1. `android:id` 用于设置`SlidingDrawer`的ID,以便在Java代码中引用。 2. `android:handle` 指定了抽屉的手柄(handle),通常是用户用来拉动抽屉的按钮或图像。 3. `android:content` 指定了抽屉打开后显示的内容...

    Handler使用

    - 使用静态内部类创建Handler,并通过弱引用持有外部类引用,以确保在外部类被回收后,Handler不会阻止其内存释放。 ```java class MainActivity extends AppCompatActivity { private static class MyHandler ...

    Java语言入门教程概览

    - **应用领域**: Java 广泛应用于企业级应用开发、Android 应用开发、大数据处理、云计算等领域。 #### 2. 环境搭建 - **JDK 安装**: - **下载**: 从 Oracle 官方网站或 Adoptium 等第三方平台下载适合您操作系统...

    android-connection-handler:Android库,用于处理与RESTful服务的通信

    ConnectionHandler是一个开放源代码Android库项目,用于处理与RESTful服务的通信。 它基于Apache HttpClient。 ConnectionHandler的优点: 支持同步和异步调用。 支持许多配置选项,例如连接超时,使用cookie等。...

    android常见的面试题

    - **语言层面**:Java程序主要使用Java语言编写,而Android程序虽然也使用Java语言,但需要遵循Android SDK的规定。 - **运行环境**:Java程序可以在多种平台上运行,而Android程序只能在Android平台上运行。 #### ...

    Android 中Handler引起的内存泄露

    弱引用不会阻止垃圾回收,即使有其他对象持有对弱引用对象的引用,只要没有强引用,对象仍然可以被回收。 ```java public class SampleActivity extends Activity { private final Handler mLeakyHandler = new ...

    SlidingDrawer1:这是slidingDrawer 的例子,SlidingDrawer 有handler 和context 两个方法,handle 和context 必须有唯一的id

    android:src="@drawable/handle_image"/&gt; android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"&gt; &lt;!-- 内容区域 --&gt; ``` - 在对应的Activity或...

Global site tag (gtag.js) - Google Analytics