2012-04-20 74 views
0

我正在閱讀收件箱中的第一封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(); 
    } 
} 
+0

這取決於您的服務。粘貼其代碼 – waqaslam 2012-04-20 08:30:20

+0

您是否正在創建SQLiteOpenHelper的多個*實例?嘗試使用單例模式 - 並且自己同步它或在數據庫上啓用線程安全。 – Jens 2012-04-20 08:33:24

+0

看到你爲什麼不從asyntask訪問剩餘的短信,爲什麼你需要服務...如果是這樣,你正在使用請釋放數據連接和內容解析器,並在服務中重新創建它,或當你的應用程序變得沒有響應時顯示你的logcat – 2012-04-20 08:37:22

回答

0

服務是在UI線程中運行的,以及,你必須有手動創建工作線程除非它是一個IntentService。

+0

我試着在doInBackground()中調用,但是UI又變得沒有反應了 – Allwyn 2012-04-20 08:43:42

+0

nono ...無所謂調用一個服務,必須在它內部創建新的線程(例如,在onStartCommand中) – EvilDuck 2012-04-20 08:46:28

+0

如果可能的話,你可以請示例代碼解釋。 – Allwyn 2012-04-20 08:48:42