0

我有一個小型項目,可以從內容提供者那裏讀取系統指標,如呼叫日誌,短信日誌等。非活動中的光標加載器

我已經創建(呼叫/ 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); 
} 

回答

3

如何在我的項目中對非活動類進行實際查詢時使用它?

要麼是實際使用Loaders或不使用Loaders的活動。歡迎在AsyncTaskThread中使用ContentResolver

+0

您可以在我的應用程序場景中提供一個AsyncTask示例。我已經在我的代碼中使用了內容解析器,但是GUI(活動)從函數調用變爲無響應,直到所有數據庫操作完成。 –

+2

@KhurramMajeed:將現有的'ReadSMSDataFromPhone()'邏輯放入'AsyncTask'的'doInBackground()'中。從'AsyncTask'的onPostExecute()更新UI。 – CommonsWare

0

我不是你的使用情況是什麼,但肯定100%......

實施LoaderCallbacks活動的點讀數據只是易用性。只要你願意,你可以聲明LoaderCallbacks,只是把它交給loaderManager:

LoaderCallbacks blah = new LoaderCallbacks() { 
//Override methods here 
} 

getLoaderManager().initLoader(LOADER_ID, null, blah);  

注意getLoaderManager()通常依賴於一個片段或活動雖然。

+0

我想在我的非Activity類中使用CursorLoader,例如SMSLogger類 –