之所以专门写了一篇文章finalize方法博客,这是通过在坑的方法引起的。一个读写jni当数据类。我在课堂上finalize该方法被调用来关闭文件和释放内存的方法。频繁调用这个类的时候在JNI里面报异常,类本来就是单例的,按理分析不应该存在这种情况,到最后分析出来就是由于在该类的finalize方法中调用了关闭文件的方法。导致下次进入再次打开文件时,被系统调用finalize方法给关闭掉了,出现异常的代码例如以下。

public class TraceHandle{
static{
try{
System.loadLibrary("TraceHandle");
}catch (UnsatisfiedLinkError ule){
Log.e("JNI", "WARNING: Could not load TraceHandle.so");
}
} private TraceHandle( String filePath ){
mFilePath = filePath;
open( filePath );
} /**
* 实例化TraceHandle
*
* */
public static TraceHandle create( String filePath ){
if (null == mTraceHandle){
mTraceHandle = new TraceHandle( filePath);
} mTraceHandle.mInitCount++; return mTraceHandle;
} /**
* 退出时销毁TraceHandle
*
* @return null.
*/
public TraceHandle destory( ){
mInitCount--;
if (mInitCount == 0 && mTraceHandle != null){
mTraceHandle.close();
mTraceHandle = null;
} return null;
} private void celan(){
if (mTraceHandle != null){
mTraceHandle.close();
mTraceHandle = null;
}
} @Override
protected void finalize() throws Throwable{
super.finalize();
//这是被系统调用的方法。系统会依据系统环境来调用。对于程序来说它的调用实际不可预见
celan();
} // 1、打开文件
private native int open(String tracePath ); // 2、搜索指定汉字
private native int[] search(byte[] wordArray); // 3、必须关闭文件
private native boolean close(); private int mInitCount = 0;
private String mFilePath = null;
private static TraceHandle mTraceHandle = null;
}

经过查阅资料和阅读《JAVA核心技术》里面相关的章节后。问题最终搞定。

在《JAVA核心技术》一书中是这样描写叙述finalize方法的:

“可以为不论什么一个类加入finalize方法。

finalize方法将在垃圾回收器清除对象之前调用。在实际应用中。不要依赖于使用finalize方法回收不论什么短缺的资源,这是由于非常难知道这种方法什么时候才可以调用。

假设某个资源须要在使用完毕立马被关闭。那么就须要由人工来管理。

能够应用一个类似dispose或close的放来完毕对应的清理操作。

特别须要说明,假设一个类使用了这个方案,当对象不再被使用时一定要调用它。

改动后的代码例如以下,去掉了finalize方法:

public class TraceHandle{
static{
try{
System.loadLibrary("TraceHandle");
}catch (UnsatisfiedLinkError ule){
Log.e("JNI", "WARNING: Could not load TraceHandle.so");
}
} private TraceHandle( String filePath ){
mFilePath = filePath;
open( filePath );
} /**
* 实例化TraceHandle
*
* */
public static TraceHandle create( String filePath ){
if (null == mTraceHandle){
mTraceHandle = new TraceHandle( filePath);
} mTraceHandle.mInitCount++; return mTraceHandle;
} /**
* 退出时销毁TraceHandle
*
* @return null.
*/
public TraceHandle destory( ){
mInitCount--;
if (mInitCount == 0 && mTraceHandle != null){
mTraceHandle.close();
mTraceHandle = null;
} return null;
} private void celan(){
if (mTraceHandle != null){
mTraceHandle.close();
mTraceHandle = null;
}
} // 1、打开文件
private native int open(String tracePath ); // 2、搜索指定汉字
private native int[] search(byte[] wordArray); // 3、必须关闭文件
private native boolean close(); private int mInitCount = 0;
private String mFilePath = null;
private static TraceHandle mTraceHandle = null;
}

由于java有自己的垃圾回收机制。所以在写代码的时候千万不能依赖于它的一些方法来回收资源(比方finalize,gc),由于这些方法的调用时机都是不可预知的。

參考资料:

1、Why not to use finalize() method in java

2、When is the finalize() method called in Java?

Android开发经验—不要指望类finalize干活的方法做你想要什么的更多相关文章

  1. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法

    在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity ...

  2. 【Android笔记】Thread类中关于join()方法的源码分析

    1.join()方法的作用: 例如有一个线程对象为Thread1,在main()方法中调用Thread1.join()方法可使得当前线程(即主线程)阻塞,而执行Thread1线程. 2.源码分析(以上 ...

  3. 【Android开发经验】使用反射,得到的类的字段、方法、并实现了简单的调用

    本文后推出Android的ICO框架做准备,所以,假设你想要一个最近的一项研究Android的ICO学生框架.你可以稍微看一下. 首先,简介一下Java里面的反射. JAVA反射机制是在执行状态中,对 ...

  4. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  5. android SQLite使用SQLiteOpenHelper类对数据库进行操作

    android SQLite使用SQLiteOpenHelper类对数据库进行操作 原文: http://byandby.iteye.com/blog/835580

  6. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

  7. Android反射出一个类中的其他类对象并调用其对应方法

    MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...

  8. Android中利用画图类和线程画出闪烁的心形

                                                        本文讲解主要涉及的知识点: 1.线程控制 2.画图类 3.心形函数 大家先看图片: <ig ...

  9. Android 通过 Intent 传递类对象

    Android中Intent传递类对象提供了两种方式一种是 通过实现Serializable接口传递对象,一种是通过实现Parcelable接口传递对象. 要求被传递的对象必须实现上述2种接口中的一种 ...

随机推荐

  1. 10招让你成为杰出的Java程序员(转)

    如果你是一个热衷于技术的 Java 程序员, 那么下面的 10 个要点可以让你在众多 Java 开发人员中脱颖而出. 1. 拥有扎实的基础和深刻理解 OO 原则 对于 Java 程序员,深刻理解 Ob ...

  2. poj2479(dp)

    题目链接:http://poj.org/problem?id=2479 题意:求所给数列中元素值和最大的两段子数列之和. 分析:从左往右扫一遍,b[i]表示前i个数的最大子数列之和. 从右往左扫一遍, ...

  3. ARM裸编程系列---UART

    S5PV210 UART说明 通用异步收发器缩写UART,这是UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER.它被用来传送串行数据.当发送数据,CPU将 ...

  4. extern int *a与extern int a[]

    extern int *a与int a[] Table of Contents 1. 问题: 2. 解答: 1 问题: 以下的声明取自某个源文件: int a[10]; int *b=a; 但在还有一 ...

  5. RabbitMQ消息队列应用

    RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...

  6. Home · chineking/cola Wiki

    Home · chineking/cola Wiki Home Cola Cola是一个分布式的爬虫框架,用户只需编写几个特定的函数,而无需关注分布式运行的细节.任务会自动分配到多台机器上,整个过程对 ...

  7. ajax基本概念,方法

    ajax    Asynchronous javascript and xml异步的 javascript and XMLajax 是一门在不刷新网页的情况下,与服务器进行交互更新部分网页的技术: 传 ...

  8. 通过Java字节码发现有趣的内幕之String篇(上)(转)

    原文出处: jaffa 很多时候我们在编写Java代码时,判断和猜测代码问题时主要是通过运行结果来得到答案,本博文主要是想通过Java字节码的方式来进一步求证我们已知的东西.这里没有对Java字节码知 ...

  9. U6Linux的文件权限与目录配置

    1.ll查看文件信息:[权限][连接][所有者][用户组][文件容量][修改日期][文件名] 2.第一个字符代表文件的属性:若为[d]则是目录.若为[-]则是文件.若为[l]则为连接. 3.chgrp ...

  10. 怎样使用jlink一键烧录整个flash Hi3518 a c e Hi3515 Hi3512

    以jlink烧录3515为例: 1\在jlink安装文件夹"C:\Program Files\SEGGER\JLinkARM_V426b"建立批处理文件"HI3515烧写 ...