在使用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;
}
}
};
}
分享到:
相关推荐
<item android:state_window_focused="false" android:drawable="@drawable/handle_normal"/> <item android:state_focused="true" android:drawable="@drawable/handle_focused"/> <item android:state_pressed=...
`handle`和`content`的ID需要与XML中的声明相匹配,以便在代码中正确引用。 SlidingDrawer有多种操作方法: - `open()`:打开抽屉。 - `close()`:关闭抽屉。 - `toggle()`:根据当前状态打开或关闭抽屉。 - `...
android:handle="@+id/handle" android:content="@+id/content" android:orientation="vertical" android:visibility="visible"> android:id="@id/handle" android:layout_width="wrap_content" android:...
这里,`app:menu`属性引用了菜单资源文件,我们将用它来定义底部导航项。 接下来,创建一个名为bottom_navigation_menu.xml的菜单资源文件,放在res/menu目录下。在这个文件中,为每个tab定义一个菜单项: ```xml ...
- `android:handle`:引用handle视图的ID。 - `android:content`:引用content视图的ID。 - `android:openGravity`和`android:closeGravity`:分别定义打开和关闭时content的位置,如"top"、"bottom"、"left"、...
将库项目添加到Android项目中,或者在build.gradle文件中引用它。 2. 初始化串口: 首先,需要找到并打开对应的USB设备,然后创建SerialPort对象来处理串口通信。 ```java UsbDevice device = ...; UsbDevice...
通过对给定的XML布局和Java代码的分析,我们深入了解了如何在Android项目中集成和控制`SlidingDrawer`,以及如何利用它来增强用户体验。这种组件特别适合于那些需要在不破坏主要UI布局的前提下,提供额外功能或信息...
这个引用对象的Handle会被保存在ServiceManager中,并与Service组件的名字对应。Service组件分为Java层和C++(Native层)两种,但它们的本质都是为了向其他进程提供服务。 当Client组件需要使用Service组件提供的...
本教程将详细讲解如何使用Java语言来实现Android的Handler消息机制,包括其基本原理、创建步骤以及如何实现跨线程通信和发送延迟消息。 一、Handler基本原理 Handler是Android系统提供的一个用于处理线程间通信的...
在Android应用开发中,创建一个类似微信的底部和顶部菜单栏是常见的需求,这不仅可以提供良好的用户界面(UI)设计,还能确保用户能够方便地访问主要功能。微信的菜单栏设计已经成为移动应用的一种典范,因此许多...
<item android:drawable="@drawable/handle_normal" android:state_enabled="true" android:state_window_focused="false"/> <!-- 触摸模式按下时的背景图片 --> <item android:drawable="@drawable/handle_...
1. `android:id` 用于设置`SlidingDrawer`的ID,以便在Java代码中引用。 2. `android:handle` 指定了抽屉的手柄(handle),通常是用户用来拉动抽屉的按钮或图像。 3. `android:content` 指定了抽屉打开后显示的内容...
- 使用静态内部类创建Handler,并通过弱引用持有外部类引用,以确保在外部类被回收后,Handler不会阻止其内存释放。 ```java class MainActivity extends AppCompatActivity { private static class MyHandler ...
- **应用领域**: Java 广泛应用于企业级应用开发、Android 应用开发、大数据处理、云计算等领域。 #### 2. 环境搭建 - **JDK 安装**: - **下载**: 从 Oracle 官方网站或 Adoptium 等第三方平台下载适合您操作系统...
ConnectionHandler是一个开放源代码Android库项目,用于处理与RESTful服务的通信。 它基于Apache HttpClient。 ConnectionHandler的优点: 支持同步和异步调用。 支持许多配置选项,例如连接超时,使用cookie等。...
- **语言层面**:Java程序主要使用Java语言编写,而Android程序虽然也使用Java语言,但需要遵循Android SDK的规定。 - **运行环境**:Java程序可以在多种平台上运行,而Android程序只能在Android平台上运行。 #### ...
弱引用不会阻止垃圾回收,即使有其他对象持有对弱引用对象的引用,只要没有强引用,对象仍然可以被回收。 ```java public class SampleActivity extends Activity { private final Handler mLeakyHandler = new ...
android:src="@drawable/handle_image"/> android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 内容区域 --> ``` - 在对应的Activity或...