1
我覺得真的愚蠢的甚至問這個問題,可能是愚蠢的問,因爲我認爲答案是「它永遠不應該那樣做」,但我非常卡在這目前的問題我在,所以我想問無論如何。有時陣列不是從多個線程添加項目
我有一個數組類,我創建...
public class Search_Results_Item {
private String SortSearchSite;
private String SortSearchLocation;
private String SortTitle;
private String SortLinkURL;
private String SortImageSRC;
private String SortPrice;
private String SortDescription;
private String SortLocation;
private String SortDateTime;
private String SortTrueDateTime;
private String SortOriginalURL;
public Search_Results_Item(String SortSearchSite, String SortSearchLocation, String SortTitle, String SortLinkURL, String SortImageSRC,
String SortPrice, String SortDescription, String SortLocation, String SortDateTime, String SortTrueDateTime, String SortOriginalURL) {
this.SortSearchSite = SortSearchSite;
this.SortSearchLocation = SortSearchLocation;
this.SortTitle = SortTitle;
this.SortLinkURL = SortLinkURL;
this.SortImageSRC = SortImageSRC;
this.SortPrice = SortPrice;
this.SortDescription = SortDescription;
this.SortLocation = SortLocation;
this.SortDateTime = SortDateTime;
this.SortTrueDateTime = SortTrueDateTime;
this.SortOriginalURL = SortOriginalURL;
}
我把它做我的方法...
private ArrayList<Search_Results_Item> SearchResultsRow = new ArrayList<Search_Results_Item>();
我從2個不同的線程是項目添加到這個開始在同一時間使用..
SearchResultsRow.add(new Search_Results_Item(sSite, sLocation, SortTitle, SortLinkURL, SortImageSRC, SortPrice, SortDescription, SortLocation,
SortDateTime, EPOCHDATETIME, sBaseURL));
然後,我有一個runnable,不斷運行,它這樣做...
getWriteDB();
Sql_Database_Globals.SQL_DATABASE.beginTransaction();
while (SearchResultsRow.size() > 0) {
int theMax = SearchResultsRow.size() - 1;
SQLCOUNT++;
Search_Results_Item ITEM = SearchResultsRow.get(theMax);
SearchResultsRow.remove(ITEM);
try {
if (ITEM != null) {
SQLiteStatement statement = Sql_Database_Globals.SQL_DATABASE
.compileStatement("INSERT INTO TEMPSORT (SortSearchSite, SortSearchLocation, SortTitle, SortLinkURL, SortImageSRC, SortPrice, SortDescription, SortLocation, SortDateTime, SortTrueDateTime, SortOriginalURL) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
statement.clearBindings();
statement.bindString(1, ITEM.getSortSearchSite());
statement.bindString(2, ITEM.getSortSearchLocation());
statement.bindString(3, ITEM.getSortTitle());
statement.bindString(4, ITEM.getSortLinkURL());
statement.bindString(5, ITEM.getSortImageSRC());
statement.bindString(6, ITEM.getSortPrice());
statement.bindString(7, ITEM.getSortDescription());
statement.bindString(8, ITEM.getSortLocation());
statement.bindString(9, ITEM.getSortDateTime());
statement.bindString(10, ITEM.getSortTrueDateTime());
statement.bindString(11, ITEM.getSortOriginalURL());
statement.executeInsert();
} else {
Log.d("EXCEPTION", "----------->NULL");
}
} catch(Exception e1){
// catch all the exceptions
Log.d("SQLEXCEPTION", "SQL - > " + e1.getMessage());
}
}
Sql_Database_Globals.SQL_DATABASE.setTransactionSuccessful();
Sql_Database_Globals.SQL_DATABASE.endTransaction();
SQLDB.close();
現在爲了一些奇怪的原因。有時會有一些項目被假設添加到SearchResults中(並且計數之前和之後確認它被添加)實際上不會被查看並試圖插入到SQLDatabase中(這正是SQLCOUNT ++的功能) 。有時候它只有1條記錄,有時候它會記錄所有記錄的時間的3.90%。
我不能爲了我的生活開始明白我失蹤了。
嘗試將'SearchResultsRow'設置爲volatile。請你詳細說明一下 – 2015-03-31 04:03:45
。 – eqiz 2015-03-31 04:04:55
如果它是一個arraylist,那麼這樣做:'volatile ArrayList SearchResultsRow;' –
2015-03-31 04:06:30