2016-04-12 23 views
-2

server no'lu sunucuya intent servisini kullanarak göndermek istiyorum. Yapmış olduğum şey niyet servisini başlatıyor ve bu sınıfta verileri yerel db'den alıyorum ve for döngüsünde veriyi sunucuya gönderiyorum. İşe yarıyor. Ben hizmet tetiklemek için bir alarm yöneticisi kullanıyorum örnekDöngüsünde android niyet hizmeti

public void onReceive(Context context, Intent intent) { 
for (int i=0;i<5;i++){ 
     Intent startService = new Intent(context, SampleService.class); 
     startWakefulService(context, startService); 
} 

} 

için yani niyet hizmetini başlatmak için döngü için kullanmak gerektiği Ama sorudur. Doğru yol nedir? lütfen yardım et. Teşekkürler! . Bu zaman kodu 'genel sınıf 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) uzanır; and this is my intent service class genel sınıf SampleService, IntentService'yi genişletir { /** * Bir IntentService oluşturur. Alt sınıfınızın kurucusu tarafından çağrıldı. * * @param name Çalışan iş parçacığı için kullanılır, yalnızca hata ayıklama için önemlidir. */ AsyncHttpClient asyncHttpClient; DbUtil dbUtil; NotificationManager notificationManager; NotificationCompat.Builder mBuilder; int id = 1; hizmet tetiklemek için

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

Neden alarm tetiklendiğinde for döngüsünü kullanıyorsunuz ve onReceive() ;? Örneğiniz bir şey kaçırmıyorsa ... mantıklı değil mi? –

+0

Tüm yapmak istediğim, belirli bir süre sonra arka planda sunucuya veri yığınlarını göndermektir. Bilmiyorum, çalışacak ya da tek bir hizmet içinde asynchttp kullanmalıyım. –

+0

Bir "IntentService", kendi iş parçacığı içinde çalışmak üzere özel olarak tasarlanmıştır; bu nedenle, "onHandleIntent()" öğesinde çalıştırılan her şey, hedef hizmetinizi birden çok kez çağırırsanız istekleri sıraya koyacak şekilde Eşzamansız olacaktır. Eğer 'IntentService' içinde birden çok görevi paralel olarak çalıştırmak istiyorsanız o zaman bir "ThreadPool" ya da "AsyncTask" 'a bir "Executor" –

cevap

1

bir alarm yöneticisi bunu yapmak için doğru yoldur. Neden döngü için kullanıyorsunuz?

+0

Yerel db'de 5 veri kümesine sahip olduktan sonra sunucuya intent hizmeti aracılığıyla göndermek istediğimi yaptım. Bunun için yerel db'yi sorgulamak ve intenservice için bir dizi göndermek for döngüsünde http komutlarını çalıştırdığım sınıf. ama doğru yol olup olmadığını bilmiyorum. –

+0

bunun için hizmetinize döngü ekleyin ve sunucuya gönderin. –