private boolean isInit = true;
private boolean isInCycle = false;
private boolean isResult = false;
-
+ private LockHandler lockHandler = null;
+
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
pref.update();
}
- LockHandler handler = new LockHandler();
- handler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+ lockHandler = new LockHandler();
+ lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
lock = false;
if (isInit) {
lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
lock = false;
+ if (lockHandler != null){
+ lockHandler.cancel();
+ lockHandler = null;
+ }
+
super.onPause();
isInCycle = false;
}
private boolean lock = false;
private boolean isInit = true;
private boolean isInCycle = false;
-
+ private LockHandler lockHandler = null;
+
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
}
};
-
+
private class NoteUpdatorReceiver extends BroadcastReceiver {
@Override
noteOrderAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
updateSpinner.setAdapter(noteOrderAdapter);
-
+
OAuthUtil authUtil = OAuthUtil.getInstance();
EvernoteSession session = authUtil.setupSession(this);
EvernoteUtil.getInstance().setSession(session);
@Override
public void sendLockResult(boolean b) {
lock = true;
-
+
if (isInit) {
isInit = false;
}
setStatus();
}
-
+
@Override
protected void onStart() {
super.onStart();
super.onResume();
isInCycle = true;
- LockHandler handler = new LockHandler();
+ lockHandler = new LockHandler();
boolean isUnlock = false;
- handler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+ lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
lock = false;
int updateTime = pref.getInt(Constant.PREF_UPDATE_TIME, 0);
}
String updateDate = pref.get(Constant.PREF_UPDATE_DATETIME);
updateDateText.setText(updateDate);
-
+
setStatus();
}
lockDao.unlock(this, Constant.LOCK_UPDATE_NOTE);
lock = false;
+ if (lockHandler != null){
+ lockHandler.cancel();
+ lockHandler = null;
+ }
+
super.onPause();
isInCycle = false;
}
private void updateButton(boolean isAll) {
// #29618
- //LockDao lockDao = (LockDao) LockDao.getInstance();
- //lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
+ // LockDao lockDao = (LockDao) LockDao.getInstance();
+ // lock = lockDao.lock(this, Constant.LOCK_UPDATE_NOTE);
+ LockDao lockDao = (LockDao) LockDao.getInstance();
+ boolean b = lockDao.move(NoteUpdateTask.LOCK_OBJ,
+ Constant.LOCK_UPDATE_NOTE);
+ if (!b) {
+ // TODO
+ return;
+ }
if (!lock) {
setStatus();
}
public void done(int errorCode) {
- // #29618
- //lock = false;
- lock = true;
-
- setStatus();
+ // TODO
+ // // #29618
+ // // lock = false;
+ // lock = true;
+ //
+ // setStatus();
+
+ if (isInCycle) {
+ // onResume()で生成している & cancel()は、呼ばれていないため
+ //lockHandler = new LockHandler();
+ boolean isUnlock = false;
+ lockHandler.lock(this, Constant.LOCK_UPDATE_NOTE, true, isUnlock);
+ lock = false;
+ setStatus();
+ }
}
private void updateSpinnerItemSelected(AdapterView<?> parent, View view,
NodeDao dao = (NodeDao) NodeCacheDao.getInstance();
List<Node> list = dao.searchBook();
- if (list == null || list.size() <= 0){
+ if (list == null || list.size() <= 0) {
msgLayout.setVisibility(View.VISIBLE);
confirmMsg.setText(getString(R.string.settingDoListMsg));
updateDateLayout.setVisibility(View.GONE);
return;
- }
-
+ }
+
list = dao.searchSelectedBook();
if (list == null || list.size() <= 0) {
msgLayout.setVisibility(View.VISIBLE);
bookButton.setEnabled(true);
updateButton.setEnabled(true);
updateSpinner.setEnabled(true);
-
+
int pos = updateSpinner.getSelectedItemPosition();
- if (pos == 0){
+ if (pos == 0) {
updateDateLayout.setVisibility(View.GONE);
- }
- else {
+ } else {
updateDateLayout.setVisibility(View.VISIBLE);
- }
+ }
msgLayout.setVisibility(View.GONE);
}
public class LockDao implements IDao<Lock> {
private static final int DEFAULT_PERIOD = 60 * 60; // 1時間
-
+
private static IDao<Lock> instance = null;
private SQLiteStatement insertStmt = null;
+ private SQLiteStatement updateStmt = null;
private SQLiteStatement deleteIdStmt = null;
private SQLiteStatement deleteUpdatedStmt = null;
insertStmt = db.compileStatement("INSERT INTO LOCK (" + "KEY,"
+ "CLASS," + "STATUS," + "UPDATED" + ") VALUES (" + "?,?,?,?"
+ ");");
- // deleteIdStmt = db.compileStatement("DELETE FROM LOCK WHERE "
- // + android.provider.BaseColumns._ID + " = ?");
+ updateStmt = db
+ .compileStatement("UPDATE LOCK SET CLASS = ? WHERE KEY = ?");
deleteIdStmt = db.compileStatement("DELETE FROM LOCK WHERE "
+ "KEY = ? AND CLASS = ?");
deleteUpdatedStmt = db.compileStatement("DELETE FROM LOCK WHERE "
+ "KEY = ? AND UPDATED < ?");
-
- }
+
+ }
@Override
public void start(SQLiteDatabase db) {
private List<Lock> search(String selection, String[] selectionArgs,
String orderBy) {
- return search(getSQLiteDatabase(),
- selection, selectionArgs, orderBy);
+ return search(getSQLiteDatabase(), selection, selectionArgs, orderBy);
}
private List<Lock> search(SQLiteDatabase db, String selection,
Calendar cal = Calendar.getInstance();
long updated = cal.getTimeInMillis();
updated -= DEFAULT_PERIOD * 1000;
-
+
deleteUpdatedNT(lock.getKey(), updated);
deleteNT(lock.getKey(), lock.getClazz());
id = addNT(lock);
return id;
}
+ public long update(Lock lock, String clazz) {
+ return update(getSQLiteDatabase(), lock, clazz);
+ }
+
+ private long update(SQLiteDatabase db, Lock lock, String clazz) {
+ long id = -1;
+ db.beginTransaction();
+ try {
+ id = updateNT(lock, clazz);
+ db.setTransactionSuccessful();
+ } finally {
+ db.endTransaction();
+ }
+ return id;
+ }
+
+ public long updateNT(Lock lock, String clazz) {
+ long id = -1;
+ int i = 1;
+
+ SQLiteStatement stmt = updateStmt;
+ stmt.bindString(i++, clazz);
+ stmt.bindString(i++, lock.getKey());
+ id = stmt.executeInsert();
+ return id;
+ }
+
public long delete(String key, String clazz) {
- return delete(getSQLiteDatabase(), key,
- clazz);
+ return delete(getSQLiteDatabase(), key, clazz);
}
public long delete(SQLiteDatabase db, String key, String clazz) {
return obj.getClass().getName();
}
+ // TODO
+ private String lockInfo = "<none>";
+
+ public String getLockInfo() {
+ return lockInfo;
+ }
+
public boolean lock(Object obj, String key) {
Calendar cal = Calendar.getInstance();
long updated = cal.getTimeInMillis();
-
+
Lock lock = new Lock();
lock.setKey(key);
- lock.setClazz(getClazz(obj));
+ lock.setClazz(getClazz(obj));
lock.setUpdated(updated);
if (this.add(lock) > 0) {
+ lockInfo = "<none>";
return true;
} else {
List<Lock> list = this.search();
String c = lock.getClazz();
String s = lock.getKey();
Debug.d(this, c + "," + s);
+ lockInfo = c + "," + s;
} catch (Exception e) {
;
}
}
}
+ public boolean move(Object obj, String key) {
+
+ Lock lock = new Lock();
+ lock.setKey(key);
+
+ return update(lock, getClazz(obj)) > 0;
+ }
+
public void unlock(Class clazz, String key) {
try {
this.delete(key, clazz.getName());
;
}
}
-
+
public void unlock(Object obj, String key) {
try {
this.delete(key, getClazz(obj));
public boolean isLock(Object obj, String key) {
return searchByKey(key) != null;
}
-
- public SQLiteDatabase getSQLiteDatabase(){
+
+ public SQLiteDatabase getSQLiteDatabase() {
return DatabaseHelper.getInstance(1).getSQLiteDatabase();
}
}
if (b) {
execute();
} else {
+ String info = dao.getLockInfo();
+ Debug.d(this, info);
updateDate(NoteUpdatorService.this
.getString(R.string.serviceUpdateReferenceDataMsg));
}
// サービス起動中の場合は、DBロックがかかり
// 更新後まで、ロックは解除されない。
+ // TODO
+ // ロックを別DBにしたため、要検討
LockDao lockDao = (LockDao) LockDao.getInstance();
lockDao.unlock(NoteUpdatorService.class,
Constant.LOCK_UPDATE_NOTE);
lockDao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
+ // TODO
+ lockDao.unlock(NoteUpdateTask.LOCK_OBJ, Constant.LOCK_UPDATE_NOTE);
lockDao = null;
}
import com.yuji.ef.utility.FolderUtil;
public class NoteUpdateTask implements AsyncTaskIF {
+ public static final Object LOCK_OBJ = new Object();
+
private WeakReference<SettingActivity> activityRef;
private boolean isRoot;
// LockDao lockDao = (LockDao) LockDao.getInstance();
// lockDao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
+ // TODO
+ // とりあえず正常系のみ
+ LockDao lockDao = (LockDao) LockDao.getInstance();
+ lockDao.unlock(NoteUpdateTask.LOCK_OBJ, Constant.LOCK_UPDATE_NOTE);
+
SettingActivity activity = getActivity();
if (activity != null) {
activity.done(errorCode);
import com.yuji.ef.dao.LockDao;
public class LockHandler {
- private final static int N = 64;
+ private final static int N = 32;
private LockDao dao = (LockDao) LockDao.getInstance();
-
+ private boolean isCanceled = false;
+
public void lock(final LockListener target, final String key,
final boolean wait, final boolean isUnlock) {
final Handler handler = new Handler() {
public void run() {
// #29573
if (isUnlock){
+ // TODO 他のロックは解除せずでよいか
dao.unlock(SettingActivity.class, Constant.LOCK_UPDATE_NOTE);
}
int n = 1;
- while (true) {
+ while (!isCanceled) {
boolean lock = dao.lock(target, key);
if (wait) {
if (!lock) {
+ String info = dao.getLockInfo();
+ Debug.d(this, info);
try {
Thread.sleep(n * 1000);
} catch (InterruptedException e) {
});
t.start();
}
+
+ public void cancel(){
+ isCanceled = true;
+ }
}