2017-09-14 2 views
0

Ceci est mon activité de base qui étend la classe activity. Je fais mes autres activités étendent cette classe de base:Afficher la boîte de dialogue lorsque l'utilisateur est hors ligne et la rejeter lorsque l'utilisateur est en ligne (avec broadcastReceiver)

public abstract class Base extends Activity { 

private BroadcastReceiver netStateReceiver; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(getLayoutResourceId()); 
} 
protected abstract int getLayoutResourceId(); 

@Override 
protected void onPause() { 
    if (netStateReceiver != null) { 
     unregisterReceiver(netStateReceiver); 
     netStateReceiver = null; 
    } 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    if (netStateReceiver == null) { 
     netStateReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(final Context context, Intent intent) { 

       final Dialog offline = new Dialog(context, android.R.style.Theme_Light); 

       //A change occurred in connection state. Check whether user has been become online or offline: 
       if (!CheckNet()) { 
        //User became offline (show offline dialog): 
        offline.setContentView(R.layout.activity_offline); 
        offline.setTitle("offline"); 
        offline.getWindow().setBackgroundDrawableResource(R.color.transparent); 

        offline.show(); 

        final Button retry = (Button) offline.findViewById(R.id.button6); 
        retry.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) { 
          if (CheckNet()) { 
           offline.dismiss(); 
          } 
         } 
        }); 

       } 
       else { 
        //User became online (dismiss offline dialog): 
        if (offline.isShowing()) { 
         offline.dismiss(); 
        } 
       } 
      } 
     }; 
     registerReceiver(netStateReceiver, new IntentFilter(Values.CONNECTIVITY_RECEIVER_ACTION)); 
    } 
    super.onResume(); 
} 

private boolean CheckNet() { 
    final ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo(); 
    return (activeNetwork != null && activeNetwork.isConnectedOrConnecting()); 
} 
} 

Comme vous le voyez dans le code que j'ai enregistré un récepteur pour vérifier l'état de la connectivité.

Je veux quand l'utilisateur est hors ligne une boîte de dialogue soit montrée à l'utilisateur et l'avise qu'il est déconnecté et devrait devenir en ligne pour continuer. Cette partie fonctionne bien.

Je souhaite également que cette boîte de dialogue s'affiche et qu'au moment où l'utilisateur se connecte, cette boîte de dialogue soit fermée, mais cette partie ne fonctionne pas et la boîte de dialogue reste à l'écran.

Quel est le problème, comment puis-je fermer la boîte de dialogue?

Répondre

1

Vous créez une nouvelle boîte de dialogue à chaque diffusion au lieu d'utiliser la boîte de dialogue que vous avez déjà créée auparavant. Faire de la variable de dialogue une variable membre de la classe d'activité, alors cela devrait fonctionner.

private Dialog offline; 

@Override 
protected void onResume() { 
    if (netStateReceiver == null) { 
     netStateReceiver = new BroadcastReceiver() { 
      @Override 
     public void onReceive(final Context context, Intent intent) { 

      if (!CheckNet()) { 
       if(offline==null || !offline.isShowing()){ 
        offline = new Dialog(context, android.R.style.Theme_Light); 
       } 
       ... 
      } else { 
       //User became online (dismiss offline dialog): 
       if (offline!=null && offline.isShowing()) { 
        offline.dismiss(); 
       } 
      } 
+0

cela fonctionne correctement, merci. – Masoud

0

Vous créez une nouvelle boîte de dialogue chaque fois que vous recevez une diffusion, de sorte que la boîte de dialogue que vous avez ignorée est une boîte de dialogue totalement différente de celle utilisée pour afficher "vous êtes actuellement hors ligne".

Essayez de mettre votre boîte de dialogue "hors ligne" dans l'activité plutôt que dans le rappel onReceive.

Un exemple simple serait:

public abstract class Base extends Activity { 

    private BroadcastReceiver netStateReceiver; 

    final Dialog offline; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(getLayoutResourceId()); 

     // You create the dialog here instead within the onReceive callback 
     offline = new Dialog(this, android.R.style.Theme_Light); 
     offline.setContentView(R.layout.activity_offline); 
     offline.setTitle("offline"); 
     offline.getWindow().setBackgroundDrawableResource(R.color.transparent); 
    } 


    @Override 
    protected void onResume() { 
     if (netStateReceiver == null) { 
      netStateReceiver = new BroadcastReceiver() { 
       @Override 
       public void onReceive(final Context context, Intent intent) { 
        if (!CheckNet()) { 
         // Your dialog already exists, just show it immediately 
         offline.show(); 

         final Button retry = (Button) offline.findViewById(R.id.button6); 
         retry.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View v) { 
           if (CheckNet()) { 
            offline.dismiss(); 
           } 
          } 
         }); 

        } 
        else { 
         //User became online (dismiss offline dialog): 
         if (offline.isShowing()) { 
          offline.dismiss(); 
         } 
        } 
       } 
      }; 
      registerReceiver(netStateReceiver, new IntentFilter(Values.CONNECTIVITY_RECEIVER_ACTION)); 
     } 
     super.onResume(); 
    } 
} 
0

Make it accès global à votre référence d'objet de dialogue:

final Dialog offline = new Dialog(context, android.R.style.Theme_Light); 

Ensuite, vous serez en mesure de fermer votre boîte de dialogue.

+0

J'ai besoin objet de contexte de la méthode OnReceive, donc je ne peux pas initialiser dialogue sur le bloc OnReceive – Masoud

+0

@Masoud vous initiez objet de dialogue à votre méthode onCreate(). – james