2015-11-17 1 views
0

Je suis en train d'utiliser la fonction suivante pour vérifier la connexion réseauVérifiez la connexion réseau à Observable avant d'effectuer des appels API

private boolean isThereInternetConnection() { 
     boolean isConnected; 
     ConnectivityManager connectivityManager = 
       (ConnectivityManager) this.context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 
     isConnected = (networkInfo != null && networkInfo.isConnectedOrConnecting()); 

     return isConnected; 
    } 

Ensuite, appelez avant moi appels API comme:

public Observable<UserEntity> userEntity(int page) {          return Observable.create(new Observable.OnSubscribe<UserEntity>() { 
      @Override 
      public void call(Subscriber<? super UserEntity> subscriber) { 
       if (isThereInternetConnection()) { 
        // I want to return: 
       return mUserApi.UserEntity(items,page); 
       // in: 
        subscriber.onNext() 
       } // otherwise return no internet connection message 
      } 
     }); 

l'esprit que mUserApi.UserEntity(items,page); est un appel à l'interface objet observable retours comme:

@GET("/user") 
    Observable <UserEntity> UserEntity(@Query("user_ids") String user_id, @Query("page") int page); 
+0

pour plus de détails, a fait vous ajoutez l'autorisation "état du réseau" dans le manifeste? – Context

Répondre

1

EDIT:

Il est votre appel de repos:

@GET("/user") 
Observable <UserEntity> UserEntity(@Query("user_ids") String user_id, @Query("page") int page); 

Dans votre classe où vous initialisez la restAdapter, mettre en œuvre le UserEntity:

public Observable<UserEntity> getUserEntity(String userId, int page){ 
    return myRestAdapterInterface.UserEntity(userId, page); 
} 

Faites votre observable qui émettra les données:

public Observable<UserEntity> userEntity(String userId, int page) { 
    return getUserEntity(userId, page).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); 
//you can map, filter or do anything here 
} 

Alors abonnez-vous aux données:

userEntity("id",5).subscribe(new Observer<UserEntity>() { 
     @Override 
     public void onCompleted() { 
      //doSomething if u want 
     } 

     @Override 
     public void onError(Throwable e) { 
      //handle error 
     } 

     @Override 
     public void onNext(List<UserEntity> userEntity) { 
      //do something with the data 
     } 
    }); 

Et pour la vérification de connexion, créez votre propre client pour la modification:

public class ConnectivityAwareUrlClient implements Client { 

private Context context; 
private Client wrappedClient; 

public ConnectivityAwareUrlClient(Context context, Client client) { 
    this.context = context; 
    this.wrappedClient = client; 

} 

@Override 
public Response execute(Request request) throws IOException { 
    if (!ConnectivityUtil.isConnected(context)) { 
     throw RetrofitError.unexpectedError("No internet", new NoConnectivityException("No Internet")); 
    } else { 
     Response response = wrappedClient.execute(request); 

     return response; 
    } 
} 

}

Et quand configurant l'RestAdapter utiliser:

RestAdapter.Builder().setEndpoint(serverHost) 
       .setClient(new ConnectivityAwareUrlClient(new OkHttpClient(), ...)) 
+0

J'ai essayé la même chose, mais j'ai reçu un message d'erreur indiquant: erreur: types incompatibles: Observable ne peut pas être converti en CAP # 1 subscriber.onNext (mUserApi.userEntiry (articles, page)); ^ où CAP # 1 est une nouvelle variable de type: – Fshamri

+0

modifié la réponse, relisez, espérons que cela aide. – KERiii

+0

merci pour votre aide. mais je ne comprends toujours pas où devrais-je faire les vérifications sur Internet avant de faire appel à api. si faire cela sur l'abonné sur la méthode d'erreur, cela signifiera que les contrôles seront effectués en cas d'erreur pas avant appel api – Fshamri