我有一個小型項目,可以從內容提供者那裏讀取系統指標,如呼叫日誌,短信日誌等。非活動中的光標加載器
我已經創建(呼叫/ SMS)記錄器類內容提供商讀取和保存信息在(呼叫/ SMS)度量 clases對象。
的MainActivity使用在(呼叫/ SMS)度量類對象的信息,並使用databaseOpenHelper類在自己的數據庫中保存的數據。
現在我打算使用CursorLoader從contentproviders加載數據。
我所看到的例子表明,MainActivity實現LoaderManager.LoaderCallbacks
如何使用這在我的項目時,實際查詢的東西是在非活動課做了什麼?
我可以在Activity中創建I 1 loaderManger並用於每個非Activity嗎?
下面是一些示例代碼片段:
從主要活動我打電話數據的收集,我通過上下文的clssess,使他們能夠在經理光標
private void CollectSystemMetrics() {
//passing the context in constructor so that it can be passed to
//the non activity classes which need it for quering
SystemMetricsCollector collector = new SystemMetricsCollector(this);
_callMetrics = collector.CollectCallMetrics();
_smsMetrics = collector.CollectSMSMetrics();
Toast toast = Toast.makeText(
MyActivity.this,
"Calls and SMS Data Collected",
Toast.LENGTH_SHORT);
toast.show();
}
方法使用在SystemMetricsCollector中以raid方式傳送SMSData
public SMSMetrics CollectSMSMetrics() {
SMSLogger smsLogger = new SMSLogger(_context);
smsLogger.ReadSMSDataFromPhone();
return smsLogger.GetSMSMetrics();
}
SMSLogger類中的變量。
Uri smsUri = Uri.parse("content://sms");
String[] selectColumns = null;
String where = null;
String whereArgs[] = null;
String sortBy = null;
方法在SMSLogger使用光標
public void ReadSMSDataFromPhone() {
int inCount = 0, outCountContacts = 0, outCountUnknown = 0;
Cursor managedCursor;
managedCursor = _context.getContentResolver().query(
smsUri,selectColumns,where,whereArgs,sortBy);
try {
if (managedCursor.moveToFirst()) {
int idxAddress = managedCursor.getColumnIndexOrThrow("address");
int idxType = managedCursor.getColumnIndex("type");
do {
int valType = managedCursor.getInt(idxType);
switch (valType) {
case 2://outgoing
String valAddress =
managedCursor.getString(idxAddress);
if (isContact(valAddress)) outCountContacts++;
else outCountUnknown++;
break;
default://incoming
inCount++;
break;
}
} while (managedCursor.moveToNext());
}
} finally {
managedCursor.close();
}//end finally
_smsMetrics.set_receivedSMS(inCount);
_smsMetrics.set_sentSMSContacts(outCountContacts);
_smsMetrics.set_sentSMSUnknown(outCountUnknown);
}
您可以在我的應用程序場景中提供一個AsyncTask示例。我已經在我的代碼中使用了內容解析器,但是GUI(活動)從函數調用變爲無響應,直到所有數據庫操作完成。 –
@KhurramMajeed:將現有的'ReadSMSDataFromPhone()'邏輯放入'AsyncTask'的'doInBackground()'中。從'AsyncTask'的onPostExecute()更新UI。 – CommonsWare