3

我正在構建SDK。無法在Android中實現回調

場景

  • 從應用程序,該顯影劑傳遞的JSONObject和URL的方法中 和SDK內。
  • 我在SQLite數據庫中添加這些值並啓動JobScheduler。
  • Jobscheduler在數據庫的0個索引處取出請求 執行它。
  • 當我得到響應時,我從數據庫中刪除該請求,現在1索引處的請求進入0索引,並且我再次執行相同的代碼,其中第0個索引請求被觸發。

的問題

  • 當我從SDK內部服務器的響應,我需要將其發送給使用回調開發。
  • 我可以將回調作爲參數,當我從用戶獲取JSON和URL時,但我不知道如何繼續下去,因爲我無法將其存儲到數據庫中
  • 假設我在數據庫中有5個請求和調度程序逐個執行它,我不知道如何將響應發回給開發人員。我無法在jobscheduler中傳遞上下文。唯一的方法是獲取數據庫中每行(請求)的相應上下文。

我試過

  • 我試圖用一個LocalBroadcastManager,但我不能創建一個通用類,並得到它的實現的onReceive()方法,也是上下文傳遞是一個問題
  • 嘗試使用領域作爲數據庫,以便我可以添加上下文類型並使用我的模型,但它不工作,因爲不支持上下文。
  • 將數據庫中的活動名稱與其他詳細信息進行存儲,然後從其中逐出課程並從課程中開始活動。然後在我的回調中調整活動。 但它拋出ClassCastException異常,因爲它試圖從名稱派生類是對開發商的應用程序,而不是在我的SDK

..

應用程序的MainActivity代碼

sdkClass.queueRequest(jo.toString(),"url1",12,"MainActivity"); 

sdkClass.queueRequest(jo2.toString(),"url2",13,"MainActivity"); 

sdkClass.queueRequest(jo.toString(),"url3",14,"MainActivity"); 

sdkClass.executeQueue(); 

的SDK類,添加和執行代碼

public void queueRequest(String payload, String URL, int requestId, String identifier){ 
    RequestsDatabase database = new RequestsDatabase(context); 
    database.insertItem(TxnType,payload,url, String.valueOf(requestId), identifier); 
} 


public JobScheduler getQueueInstance(Context context){ 

    if(jobScheduler==null){ 
     jobScheduler = (JobScheduler)context.getSystemService(JOB_SCHEDULER_SERVICE); 
    } 
    return jobScheduler; 
} 
public void executeQueue(){ 
    getQueueInstance(context); 
    ComponentName jobService = new ComponentName(context.getPackageName(), MyJobService.class.getName()); 
    JobInfo jobInfo = new JobInfo.Builder(1,jobService).setPersisted(true).setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY). build(); 
    jobScheduler.schedule(jobInfo); 
} 

MyJobServiceCode

@Override 
public boolean onStartJob(JobParameters params) { 

    // UtilityMethods.showToast(this,params.getExtras().getString("json")); 
    Toast.makeText(this,"test", Toast.LENGTH_SHORT).show(); 
    database = RequestsDatabase.getInstance(this); 
    ALlRequests = database.getAllItemId(); 
    executeCall(); 

    return false; 
} 
public void executeCall(){ 
    ALlRequests = database.getAllItemId(); 
    if(ALlRequests.size()>0) { 
     requestModel = ALlRequests.get(0); 

     try { 
      String payload = getPayload(this, requestModel.getTxnType(), requestModel.getPayload()); 
      SilverLineRequest req = new SilverLineRequest(this, requestModel.getUrl(), payload, Integer.parseInt(requestModel.getRequestId()), this); 
      req.executeToServer(); 
      Toast.makeText(getApplicationContext(), "requested", Toast.LENGTH_LONG).show(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
    else{ 
     Toast.makeText(this, "Queue empty", Toast.LENGTH_LONG).show(); 
    } 

} 
@Override 
public void onSuccess(String response, int requestId) { 
    if(requestId ==Integer.parseInt(requestModel.getRequestId())){ 
     Toast.makeText(this,"responded", Toast.LENGTH_SHORT).show(); 
     database.deleteItem(requestModel.getTxnType()); 

     // HERE I WANT TO SEND THE USER RESPONSE LIKE 
     // listener.onTransactionSuccess(response) 
     // BUT I DON'T HAVE 'listener' SO IT SHOWS NULLPOINTER 


     SDKClass sl = new SDKClass(this); 
     sl.executeQueue(); 
    } 
} 

現在任何幫助都會受到祝福。

+0

爲什麼在數據庫中存儲你不想存儲的東西? 爲什麼不將它們存儲在內存中? (我的意思是未決請求) – Eselfar

+0

@Eselfar因爲如果在任何提交點擊時,互聯網不存在,我讓用戶繼續,我將他的請求存儲在數據庫中,並啓動jobscheduler。所以每當互聯網來臨時,它都會被執行。即使應用程序被終止,甚至手機重新啓動,jobscheduler也會處理持久性。所以這是我維護的一種隊列機制。 –

+0

所以在這種情況下,我認爲你可以使用PendingIntent。 – Eselfar

回答

0

將請求存儲在數據庫中,因此它可以具有唯一的id(自動增量)。 然後,您可以使用關係請求id - >回調將回調存儲在內存中。 作爲迴應,你可以打電話給它。

如果需要,請將id返回給開發人員。然後,他們可以綁定和解綁,並在需要時獲得結果,甚至是昨天的迴應。

例如,看看TransferUtility from Amazon AWS SDK