如何在简单的非活动java类中创建类似onDestroy的方法?

时间:2015-09-14 07:27:21

标签: java android ondestroy

我希望在关闭或销毁类的实例时执行一个或两个操作。我在活动中寻找类似于onDestroy的东西。

修改

我已经添加了我的代码,我指的是如何从Helper类中提供SQLiteDatabase。我使用finalize代码来确保数据库已关闭。

public class PMDBDatabase {

    private static SQLiteDatabase DataBase = null;
    private static PMDBHelper dbHelper = null;

    public SQLiteDatabase getDatabase(Context ctx) throws SQLException {
        if (DataBase == null) {
            dbHelper = PMDBHelper.getInstance(ctx);
            DBOpen();
        } else
            if(!DataBase.isOpen())
                DBOpen();
        return DataBase;
    }

    private void DBOpen() throws SQLException {
        DataBase = dbHelper.getWritableDatabase();
    }

    public void close(){
        if(DataBase != null)  DataBase.close();
    }

    protected void finalize() throws Throwable {
        try {
            close();
        } finally {
            super.finalize();
        }
    }
}

你能帮助这个新手进行Java / Android编程并指出finalize的实现是否正确吗?

非常感谢你的时间,

3 个答案:

答案 0 :(得分:2)

你不能这样做,因为GC会自动处理它。

  

因为Java是一种垃圾收集语言,所以无法预测何时   (或者甚至)一个物体将被摧毁。因此没有直接的   相当于析构函数。有一个名为的继承方法   最终确定,但完全由垃圾自行决定   收集器。

<强>最终化

  

可以在Java中使用类似于析构函数的东西   方法Object.finalize(),但它不能像a一样工作   标准的析构函数会。

答案 1 :(得分:1)

就像其他答案所说的那样,没有这样的事情。但我自己也有同样的需求,这就是我接近它的方式。

在我的情况下,需要做一些最终事情的类有自己的线程。如果您实施try { IEnumerator files = Directory.GetFiles(directoryPath).GetEnumerator(); while (files.MoveNext()) { string ls_Outputpath = System.Reflection.Assembly.GetExecutingAssembly().Location.Substring(0, System.Reflection.Assembly.GetExecutingAssembly().Location.LastIndexOf("\\")) + "\\Output\\Result_" + DateTime.Now.ToString("ddMMyyyyhhmmss") + ".txt"; string fileExtension = Path.GetExtension(Convert.ToString(files.Current)); string fileName = Convert.ToString(files.Current).Replace(fileExtension, string.Empty).Trim(); string strImageTextFileName = string.Empty; if (fileExtension == ".jpg" || fileExtension == ".JPG" || fileExtension == ".Jpeg") { gs_Filename = fileName; try { MODI.Document md = new MODI.Document(); md.Create(Convert.ToString(files.Current)); try { md.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true); } catch (Exception ex) { Log(ex.Message.ToString(), gsLogFileName); } MODI.Image image = (MODI.Image)md.Images[0]; FileStream createFile = new FileStream(fileName + ".txt", FileMode.CreateNew); strImageTextFileName = Path.GetFileName(fileName); StreamWriter writeFile = new StreamWriter(createFile); writeFile.Write(image.Layout.Text); writeFile.Close(); } catch (Exception ex) { Log("Exception in Extracting text from Image :" + ex.Message.ToString(), gsLogFileName); } } } } catch (Exception ex) { } ,可以Runnable使用override方法并让它做最后的事情。

答案 2 :(得分:0)

查看AutoCloseable特别是

    An object that may hold resources (such as file or socket handles)
 until it is closed. The close() method of an AutoCloseable object is
 called automatically when exiting a try-with-resources block for which
 the object has been declared in the resource specification header. This
 construction ensures prompt release, avoiding resource exhaustion
 exceptions and errors that may otherwise occur.

无法保证何时会调用finalize。你被激励编写自己负责资源的代码,AutoCloseable是你最好的选择。