我正在閱讀收件箱中的第一封100條短信,並將其存儲在本地數據庫中。我正在用AsyncTask的幫助來做這件事。之後,我正在從本地數據庫讀取這些SMS並顯示它。在讀取&存儲前100條短信後,在AysncTask的onPostExecute中,我調用該服務讀取剩餘的SMS並將其存儲在本地數據庫中。直到調用服務之前,UI纔會響應,但在調用服務之後,UI變得無響應。是由於數據庫鎖定或其他原因?請幫助解決這個問題...從活動,異步和服務訪問SQLite
我的AsyncTask代碼
private class InitialSetup extends AsyncTask<String, Integer, Long> {
@Override
protected Long doInBackground(String... urls) {
fetchSMS();
updateDatabase();
return 0L;
}
@Override
protected void onPostExecute(Long result) {
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
populateUI(getApplicationContext());
Intent intent = new Intent(getApplicationContext(), SMSService.class);
getApplication().startService(intent);
}
}
服務代碼
public class SMSService extends Service {
Long inboxSMSID, localSMSID;
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onStart(Intent intent, int startid) {
if (intent.hasExtra("InboxSMS") && intent.hasExtra("SMSID")) {
inboxSMSID = intent.getLongExtra("InboxSMS", 0);
localSMSID = intent.getLongExtra("SMSID", 0);
globalToLocalSMSDB(inboxSMSID);
}
}
private void globalToLocalSMSDB(Long id) {
SMSTable smsObj = new SMSTable(getApplicationContext());
smsObj.open();
Uri uriSMSURI = Uri.parse("content://sms/inbox");
Cursor smscur = getContentResolver().query(uriSMSURI, null,
"_id < " + id, null, "_id DESC");
while (smscur.moveToNext()) {
String sender = SMSManagement.getSender(smscur);
String message = SMSManagement.getMessage(smscur);
String timeStamp = SMSManagement.getTime(smscur);
smsObj.insertIntoSMSTable(sender, message, timeStamp);
}
smscur.close();
smsObj.close();
}
}
這取決於您的服務。粘貼其代碼 – waqaslam 2012-04-20 08:30:20
您是否正在創建SQLiteOpenHelper的多個*實例?嘗試使用單例模式 - 並且自己同步它或在數據庫上啓用線程安全。 – Jens 2012-04-20 08:33:24
看到你爲什麼不從asyntask訪問剩餘的短信,爲什麼你需要服務...如果是這樣,你正在使用請釋放數據連接和內容解析器,並在服務中重新創建它,或當你的應用程序變得沒有響應時顯示你的logcat – 2012-04-20 08:37:22