2016-04-12 15 views
-2

サーバインテントサービスを使用してデータを送信したいとします。私が行ったことは、インテントサービスを開始し、そのクラスでローカルのデータベースからデータを取得し、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); 
    } 
} 

} `

+0

アラームが発生したときにforループを使用して、なぜonReceive();に戻るのですか?あなたの例は意味をなさない...私は何かが欠けている場合を除きますか? –

+0

私がしたいのは、特定の期間が経過した後、バックグラウンドでサーバーにデータのチャンクを送信することだけです。私はそれが実行される複数のインテントサービスを使用する必要があるか、または1つのインテントサービス内でasynchttpを使用する必要があるかわかりません。 –

+0

'IntentService'は独自のワーカースレッドで実行するように特別に設計されているので、' onHandleIntent() 'で実行されるものはすべてインテントサービスを複数回呼び出すと非同期になります。 'IntentService'で複数のタスクを並行して実行したい場合は、' Executor'を使って 'ThreadPool'または' AsyncTask'を呼び出す必要があります –

答えて

1

アラームマネージャは、これを行うには正しい方法です。なぜあなたはループのために使うのですか?

+0

ローカルデータベースに5つのデータセットがあり、インテントサービスを通してサーバーに送信したいのですが、これは私が行ったことですが、私はローカルデータベースにクエリを送り、intentserviceに配列を送ります私はhttpコマンドをforループで実行するクラスです。しかし、正しい方法であるかどうかはわかりません。サービスのadd forループのために –

+0

を追加し、それをサーバーに送信します。 –