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();
}
}
現在任何幫助都會受到祝福。
爲什麼在數據庫中存儲你不想存儲的東西? 爲什麼不將它們存儲在內存中? (我的意思是未決請求) – Eselfar
@Eselfar因爲如果在任何提交點擊時,互聯網不存在,我讓用戶繼續,我將他的請求存儲在數據庫中,並啓動jobscheduler。所以每當互聯網來臨時,它都會被執行。即使應用程序被終止,甚至手機重新啓動,jobscheduler也會處理持久性。所以這是我維護的一種隊列機制。 –
所以在這種情況下,我認爲你可以使用PendingIntent。 – Eselfar