サーバにインテントサービスを使用してデータを送信したいとします。私が行ったことは、インテントサービスを開始し、そのクラスでローカルのデータベースからデータを取得し、forループでデータをサーバーに送信することです。できます。しかし、私の質問は、目的のサービスを開始するためにループを使用する必要があります。たとえば、android intent service in loop
public void onReceive(Context context, Intent intent) {
for (int i=0;i<5;i++){
Intent startService = new Intent(context, SampleService.class);
startWakefulService(context, startService);
}
}
私はサービスをトリガーするためにアラームマネージャーを使用しています。正しい方法は何ですか?助けてください。ありがとう! 。これは私のコード `パブリッククラスScheduleAlarmRecieverがWakefulBroadcastReceiver {
private AlarmManager alarmManager;
private PendingIntent pendingIntent;
final int REQUEST_CODE=10;
SessionManager manager;
@Override
public void onReceive(Context context, Intent intent) {
manager=new SessionManager(context);
Log.e("ScheduleAlarmReceiver","New intent");
Log.e("ScheduleAlarmReceiver","Service is set");
Intent startService = new Intent(context, SampleService.class);
startWakefulService(context, startService);
}
public void setAlarm(Context context){
Intent intent=new Intent(context,ScheduleAlarmReciever.class);
pendingIntent=PendingIntent.getBroadcast(context,REQUEST_CODE,intent, PendingIntent.FLAG_UPDATE_CURRENT);
long firstMillis=System.currentTimeMillis();
long INTERVAL_IN_MILLIS=2*60*1000; //two minutes interval
alarmManager= (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,firstMillis,INTERVAL_IN_MILLIS,pendingIntent);
}
} this is how i am setting the alarm
alarmReciever.setAlarm(MainActivity.this)に延びています。 and this is my intent service class
public class SampleService extends IntentService { /** * IntentServiceを作成します。サブクラスのコンストラクタによって呼び出されます。 * * @param nameワーカースレッドに名前を付けるために使用されます。重要なのはデバッグだけです。 */ AsyncHttpClient asyncHttpClient; DbUtil dbUtil; NotificationManager notificationManager; NotificationCompat.Builder mBuilder; int id = 1;サービスをトリガする
public static final String API="http://customer-data.com/api/insertblevital";
public SampleService() {
super("sampleservice");
}
@Override
public void onCreate() {
super.onCreate();
asyncHttpClient=new SyncHttpClient();
dbUtil=DbUtil.getInstance(getApplicationContext());
notificationManager= (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
@Override
protected void onHandleIntent(Intent intent) {
if(0!=dbUtil.getAllData().size()) {
mBuilder= new NotificationCompat.Builder(getApplicationContext());
mBuilder.setContentText("Uploading data")
.setContentTitle("Sample Upload")
.setSmallIcon(R.drawable.ic_launcher);
mBuilder.setProgress(0, 0, true);
notificationManager.notify(id,mBuilder.build());
for(int i=0;i<dbUtil.getAllData().size();i++){
Log.e("Sample email",dbUtil.getAllData().get(i).getEmail());
}
ArrayList<Sample> sampleArrayList = dbUtil.getAllData();
for (Sample sample : sampleArrayList) {
postData(sample);
}
mBuilder.setContentText("upload Complete");
mBuilder.setProgress(0, 0, false);
notificationManager.notify(id,mBuilder.build());
}
}
public void postData(Sample sample){
RequestParams requestParams=new RequestParams();
requestParams.add("email",sample.getEmail());
requestParams.add("Name",sample.getName());
requestParams.add("Height",sample.getHeight());
requestParams.add("Gender",sample.getGender());
asyncHttpClient.post(API,requestParams,new PostResponseHandler(sample.getEmail()));
}
public class PostResponseHandler extends TextHttpResponseHandler{
String email;
public PostResponseHandler(String email){
this.email=email;
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
Log.e("failure","failure");
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
Log.e("responseString",responseString);
ArrayList<String> stringArrayList=new ArrayList<>();
stringArrayList.add(email);
dbUtil.UpdateFlag(stringArrayList);
}
}
} `
アラームが発生したときにforループを使用して、なぜonReceive();に戻るのですか?あなたの例は意味をなさない...私は何かが欠けている場合を除きますか? –
私がしたいのは、特定の期間が経過した後、バックグラウンドでサーバーにデータのチャンクを送信することだけです。私はそれが実行される複数のインテントサービスを使用する必要があるか、または1つのインテントサービス内でasynchttpを使用する必要があるかわかりません。 –
'IntentService'は独自のワーカースレッドで実行するように特別に設計されているので、' onHandleIntent() 'で実行されるものはすべてインテントサービスを複数回呼び出すと非同期になります。 'IntentService'で複数のタスクを並行して実行したい場合は、' Executor'を使って 'ThreadPool'または' AsyncTask'を呼び出す必要があります –