2017-06-29 2 views
5

Je suis en train d'ajouter la fonctionnalité de Sheduled Task dans Android pour faire quelque chose après un moment comme je veux savoir à chaque fois que l'utilisateur perd sa connexion Internet, je veux faire un dialogue d'alerte. Donc, je le fais en utilisant Sheduled Task Execution mais chaque fois que j'ai mis mon code d'exécution dans Runnable, la tâche n'a pas fonctionné.Pourquoi le code dans l'annexe Tâche Exécution Taux fixe ne fonctionne pas?

important est que je fais cela en classe de service

CODE EST

package com.example.sid.marwadishaadi.LoginHistory; 

import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.AsyncTask; 
import android.os.IBinder; 
import android.provider.Settings; 
    import android.support.v7.app.AlertDialog; 
    import android.util.Log; 
    import android.widget.Toast; 

    import java.util.concurrent.Executors; 

    import java.util.concurrent.ScheduledExecutorService; 
    import java.util.concurrent.TimeUnit; 

    import static com.bumptech.glide.gifdecoder.GifHeaderParser.TAG; 

     public class OnClearFromRecentService extends Service { 

      @Override 
      public IBinder onBind(Intent intent) { 
       return null; 
      } 

      @Override 
      public int onStartCommand(Intent intent, int flags, int startId) { 
       Log.e("ClearFromRecentService-", "-----------------------------------------Service Started"); 
       SharedPreferences sharedPreferences=getSharedPreferences("userinfo",MODE_PRIVATE); 
       SharedPreferences.Editor edtr=sharedPreferences.edit(); 
       String id=sharedPreferences.getString("customer_id",""); 
       Log.e(TAG, "onStartCommand: .........................."+id); 
       if(isOnline()) { 
        Toast.makeText(this, "You are online", Toast.LENGTH_SHORT).show(); 
       } 

       ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5); 
       scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
        public void run() {        

         Log.i(TAG, "run: ----I'm running after 15 seconds"); 
         if(isOnline()) { 
          //Dummy TODO, you can do something if you want, 
          Toast.makeText(OnClearFromRecentService.this, "You are not online", Toast.LENGTH_SHORT).show(); 
         } 

         else{ 
          Log.i(TAG, "run: --- exited from here or not :::: yes "); 
          AlertDialog.Builder network =new AlertDialog.Builder(OnClearFromRecentService.this); 
          network.setTitle("No Internet"); 
          network.setMessage("Please check your internet connection or go to the internet option by clicking #settings"); 
          network.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialogInterface, int i) { 
            getApplicationContext().startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); 
           } 
          }); 
          network.setNegativeButton("Exit", new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialogInterface, int i) { 
            Intent intent = new Intent(Intent.ACTION_MAIN); 
            intent.addCategory(Intent.CATEGORY_HOME); 
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
            startActivity(intent); 
           } 
          }); 
          network.setCancelable(false); 
          AlertDialog alertDialog = network.create(); 
          alertDialog.show(); 


         } 

        } 
       }, 0, 15, TimeUnit.SECONDS); 

       return START_NOT_STICKY; 
      } 

     public boolean isOnline() { 
    ConnectivityManager conMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = conMgr.getActiveNetworkInfo(); 

    if(netInfo == null || !netInfo.isConnected() || !netInfo.isAvailable()){ 
     Toast.makeText(getApplicationContext(), "No Internet connection!", Toast.LENGTH_LONG).show(); 
     return false; 
    } 
    return true; 
} 



      @Override 
      public void onDestroy() { 
       super.onDestroy(); 
       Log.e("ClearFromRecentService-", "-----------------------------------Service Destroyed"); 
      } 

      @Override 
      public void onTaskRemoved(Intent rootIntent) { 
       Log.e("Clearvi--------------", "---------------------------------END"); 
       //Code here 

       stopSelf(); 
      } 


     } 

quand je ne l'ai pas fait quelque chose dans la tâche prévue en français et l'impression d'une seule ligne, puis fonctionnent très bien comme

log.e ("", "Je cours après 15 sec") - >> ligne d'impression dans le journal

mais quand je mets mon code alors ça ne marche pas, comme le code n'a pas fonctionné.

Quelqu'un peut-il suggérer quelque chose, il sera vraiment utile pour noob. Enveloppez votre méthode run dans le bloc try-catch

+0

des journaux d'erreur? – Kaushal28

+0

@ Kaushal28 Aucune erreur dans le journal –

+0

Essayez d'envelopper votre code avec 'try catch' et vérifiez les erreurs. Sinon, cela devrait fonctionner correctement. – Kaushal28

Répondre

2

Juste une supposition: Une exception est levée. Un ScheduledExecutorService s'arrête silencieusement s'il rencontre une exception.

Le code de la méthode d'exécution doit toujours être entouré d'un try-catch pour gérer et absorber toute exception lancée.

Si vous essayez de créer un Looper avant d'essayer de l'ouvrir, cela fonctionnera correctement car vous ne pouvez pas gérer un thread d'interface utilisateur à partir d'un thread actif.

+0

Oui, cela a fonctionné mais chaque fois qu'il déclenche une exception. L'erreur est ** exception inattendue, looper ne peut pas gérer une partie de l'activité de vue ** –

+0

Merci, je prends l'erreur et faire un looper avant d'essayer attraper et cela a fonctionné très bien, merci +1 –