3
SDKをビルドしています。Androidでコールバックを実装できません
シナリオ
- アプリから、開発者は、方法 およびSDK内部JsonObjectとURLを渡します。
- これらの値をSQLiteデータベースに追加し、JobSchedulerを開始します。
- Jobschedulerは、データベースから0のインデックスでリクエストを受け取り、 がそれを実行します。
- 私は応答を取得すると、データベースからその要求を削除し、1インデックスの要求が0インデックスに来るようになり、再び0インデックス要求が発生した同じコードを実行します。
問題
- 私はSDKの内部サーバーからの応答を取得すると、私は、コールバックを使用して、開発者に送信する必要があります。
- ユーザーからJSONとURLを取得するときにコールバックを引数として取ることができますが、データベースに格納できないためにさらに処理する方法がわかりません
- データベースに5つのリクエストがあるとしますスケジューラがそれを1つずつ実行すると、私はどのようにレスポンスを開発者に送り返すのか分かりません。私はジョブスケジューラのコンテキストを渡すことはできません。これを行う唯一の方法は、データベース内の各行(要求)に対応するコンテキストを取得することです。私は、また、コンテキストを渡すが問題
- 私はLocalBroadcastManagerを使用してみましたが、私はジェネリッククラスを作成し、それが実装さonreceive()メソッドだ得ることができませんでした試みた何
- Realmをデータベースとして試して、コンテキストタイプを追加してモデルを使用できるようにしましたが、コンテキストがサポートされていないため動作しません。
- 他の詳細と一緒にデータベースにアクティビティ名を格納し、そのクラスからアクティビティ名とアクティビティをクラスから取り除きます。そして、私のコールバックにアクティビティを型キャストします。 しかし、それはそれは名前から派生しようとするクラスとして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();
コード
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();
}
}
を追加し、実行SDKクラスどんな援助もすぐに祝福されます。
保存したくないものをデータベースに保存するのはなぜですか? なぜそれらをメモリに保存しないのですか? – Eselfar
@ Eselfar投稿のクリック時にインターネットが存在しない場合は、ユーザーに処理を依頼し、彼のリクエストをデータベースに保存してジョブスケジューラを開始するためです。だからインターネットが来るたびに、それは実行されます。アプリが強制終了された場合や電話機が再起動された場合でも、ジョブスケジューラは永続性を処理します。だから、私が維持しているのはキュー機構のようなものです。 –
そのような場合は、PendingIntentを使用できると思います。 – Eselfar