[教學] Android Studio 重覆使用物件或 class 造成的問題及解決方法

一般程式設計時為了節省系統資源,對於時常頻繁使用的變數或陣列,宣告後會重覆使用,但這個方式在 Android Studio 中這麼做卻會造成錯誤或問題,範例如下:

public class TDB_Columns
{
public int iNo;
public String sName;
public String sLogDate;
public String sLog;
public int iRank;
};
//query from database and add all existed data to arraylist
public ArrayList<TDB_Columns> query_db_to_array()
{
ls_Result.setAdapter(null);
TDB_Columns DB_Columns=new TDB_Columns(); //<--------------Here is wrong
Cursor cursor = db.rawQuery("select * from FRecord_Table", null);
ArrayList<TDB_Columns> arrayStrings = new ArrayList<TDB_Columns>();
cursor.moveToFirst();
int iCount=0;
while (cursor.moveToNext()) {
DB_Columns.iNo=cursor.getInt(0);
DB_Columns.sLogDate=cursor.getString(1);
DB_Columns.sName=cursor.getString(2);
DB_Columns.sLog=cursor.getString(3);
DB_Columns.iRank=cursor.getInt(4);
arrayStrings.add(iCount, DB_Columns);
iCount++;
}
cursor.close();
return arrayStrings;
}

可以看到,因為 while 迴圈中會不斷以 DB_Columns 去儲存資料表中的資料,供後續使用,
所以我宣告一次 DB_Columns 物件後就重覆使用,因而造成編譯或執行過程中不如預期的問題。

 

正確的作法應該是:

 public ArrayList<TDB_Columns> query_db_to_array()
{
ls_Result.setAdapter(null);
Cursor cursor = db.rawQuery("select * from FRecord_Table", null);
ArrayList<TDB_Columns> arrayStrings = new ArrayList<TDB_Columns>();
cursor.moveToFirst();
int iCount=0;
while (cursor.moveToNext()) {
TDB_Columns DB_Columns=new TDB_Columns();  //<---Shall new a object here every time
DB_Columns.iNo=cursor.getInt(0);
DB_Columns.sLogDate=cursor.getString(1);
DB_Columns.sName=cursor.getString(2);
DB_Columns.sLog=cursor.getString(3);
DB_Columns.iRank=cursor.getInt(4);
arrayStrings.add(iCount, DB_Columns);
iCount++;
}
cursor.close();
return arrayStrings;
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *