无法在Android

时间:2017-07-18 08:43:40

标签: android sqlite android-activity android-service android-jobscheduler

我正在构建SDK。

情景

  • 从应用程序中,开发人员在方法中传递JsonObject和URL 并在SDK内部。
  • 我在SQLite数据库中添加这些值并启动JobScheduler。
  • Jobscheduler从数据库中的0个索引处获取请求 执行它。
  • 当我收到回复时,我从数据库中删除了该请求,现在1索引处的请求进入0索引,并再次执行相同的代码,其中第0个索引请求被触发。

问题

  • 当我从SDK中的服务器获得响应时,我需要使用回调将其发送给开发人员。
  • 当我从用户那里获取JSON和URL时,我可以将回调作为参数,但我不知道如何继续进行,因为我无法将其存储到数据库中
  • 假设我在数据库中有5个请求,并且调度程序逐个执行,我不知道如何将响应发送回开发人员。我无法在jobscheduler中传递上下文。唯一的方法是为数据库中的每一行(请求)获取相应的上下文。

我尝试了什么

  • 我尝试使用 LocalBroadcastManager ,但我无法创建泛型类并实现onreceive()方法,上下文传递也是一个问题
  • 尝试使用 Realm 作为数据库,以便我可以添加Context类型并使用我的模型,但它不起作用,因为不支持Context。
  • 使用其他详细信息在数据库中存储活动名称,然后从中驱逐类和来自类的活动。然后将活动强制转换为我的回调。 但它会抛出ClassCastException,因为它试图从Name派生的类位于开发人员的应用程序而不是我的SDK中

...

应用程序的主要活动代码

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();
    }
}

现在任何帮助都会受到祝福。

1 个答案:

答案 0 :(得分:0)

您将请求存储在数据库中,因此它可以具有唯一ID(自动增量)。 然后,您可以使用关系请求ID将回调存储在内存中 - >打回来。 在回复时你可以调用它。

如果需要,请将id返回给开发人员。然后他们可以绑定和取消绑定并在需要时获得结果,甚至是昨天的响应。

TransferUtility from Amazon AWS SDK为例。