![](/img/trans.png)
[英]Application goes into an infinite loop while trying to retrieve from database
[英]Constantly retrieve data from database in a infinite loop
我用一個名為flagTable的表創建了一個數據庫,這個表只有兩個字段,分別是id(自動增量)和一個整數字段。 接下來,在我的程序中,我有一個按鈕可以觸發線程啟動。 當線程啟動時,它不斷從數據庫中檢索數據,並檢查值,如果值等於 1,則它將觸發另一個新線程,如下所示:
private class statusOfStrummingInAnotherDevice extends Thread {
int value;
public void run() {
try{
while(true){
try{
if(flagCursor == null){
flagCursor = cdb1.getFlagAll();
}
}catch(Exception e){break;}
try{
Log.i("MAIN3ACTIVITY","getting status");
int size = cdb1.getSize(flagCursor);
Log.i("MAIN3ACTIVITY","SIZE is" + String.valueOf(xyz));
for(int i = 0 ; i < size ; i++){
flagCursor.moveToPosition(i);
Log.i("MAIN3ACTIVITY","getting status jkasdfasdf");
value = cdb1.getFlag();
if(value == 1){
Log.i("FLAGCURSOR=====>>>>","Succesful");
releasingNotes = new ReleasingNotes(IntendedChord);
releasingNotes.start();
//break;
}
cdb1.updateFlag(0);
Log.i("FLAGCURSOR=====>>>>",String.valueOf(value));
}
flagCursor = null;
}catch(Exception e){break;}
Log.i("MAIN3ACTIVITY","thread is sleeping");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
}catch(Exception e){
}
}
}
同時,從數據庫中檢索到的數據正在使用這個函數:
public Cursor getFlagAll(){
return getReadableDatabase().rawQuery(
"SELECT _ID, flag from flagTable", null);
}
並且,通過這種方法更新到數據庫的數據:
public int updateFlag(int i) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("flag",i);
return db.update("flagTable" , contentValues , "_ID" + "= ?",new String[]{String.valueOf(1)});
}
現在,上面的代碼不會出錯,但是,從數據庫中檢索到的數據始終為 1,它會不斷觸發新函數。 在我上面的代碼中,我說如果值等於1,那么當前線程會觸發一個新線程開始,當它完成時,程序會將當前數據更新為0。這樣,下一輪無限循環可以停止觸發新線程,直到滿足條件。 這里有什么問題? 我的代碼真的更新了新值嗎? 或者每次更新新值時都需要引用數據庫。
對您的數據庫使用偵聽器。
使用SQLiteTransactionListener
並在onCommit()
做你的事情
這里有一些詳細指南: https : //developer.android.com/reference/android/database/sqlite/SQLiteTransactionListener.html和
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.