我希望在关闭或销毁类的实例时执行一个或两个操作。我在活动中寻找类似于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的实现是否正确吗?
非常感谢你的时间,
让
答案 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是你最好的选择。