2017-01-12 2 views
1

J'utilise l'architecture propre et la couche de modèle a un référentiel, une interface de mise à niveau et une classe qui implémente le référentiel et crée le service de mise à niveau. J'utilise cet exemple: https://github.com/saulmm/AvengersComment utiliser SharedPreferences et Context dans la couche de modèle d'Android?

Voici les classes: Rénovation service api

public interface ApiService { 


    @GET("api/events") 
     Observable<List<Event>> getEvents(); 

    @GET("api/event/{id}") 
     Observable<Event> getEvent(@Path("id") int id); 


    @Multipart() 
    @POST("api/events") 
     Observable<Event> postEvent(@Part("venue") Venue venue, 
            @Part RequestBody image, 
            @PartMap Map<String, RequestBody> params 
            ); 
    } 

dépôt

public interface WyatRepository { 




    Observable<List<Event>> getEvents(); 


    Observable<Event> getEvent(int id); 


    Observable<Event> postEvent(Venue venue, String path, Map map); 
} 

et la classe source de données reste:

public class RestDataSource implements WyatRepository { 

    public final static String ENDPOINT = "http://xxxxxxxx.com/"; 
    private final ApiService apiService; 


    public RestDataSource() { 

     OkHttpClient client = new OkHttpClient(); 
     HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); 
     loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 

     client.interceptors().add(loggingInterceptor); 

     client.interceptors().add(new Interceptor() { 
      @Override 
      public Response intercept(Chain chain) throws IOException { 
       Request original =chain.request(); 

       Request request = original.newBuilder().header("Authorization",new SharedPreferencesUtil(getBaseContext()).getToken) 
         .method(original.method(),original.body()) 
         .build(); 



       return null; 
      } 
     }); 


     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(ENDPOINT) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
       .client(client) 
       .build(); 

     apiService = retrofit.create(ApiService.class); 
    } 

    @Override 
    public Observable<Album> getAlbum(int id) { 
     return apiService.getAlbum(id); 
    } 

    @Override 
    public Observable<List<Event>> getEvents() { 
     return apiService.getEvents(); 
    } 

    @Override 
    public Observable<Event> getEvent(int id) { 
     return apiService.getEvent(id); 
    } 

Mon question est dans la dernière classe où dans le constructeur I J'utilise SharedPrefences, mais une erreur se produit car je ne peux pas utiliser le contexte android ou SharedPreferences pour obtenir le jeton d'accès enregistré car il s'agit de la couche du modèle. Comment puis-je résoudre ce problème afin que je puisse utiliser un jeton d'accès de la couche modèle sans utiliser de classe com.android?

+0

vous attendez-vous le Jeton de changer lors de l'exécution? Sinon pourquoi ne pas simplement l'injecter dans le constructeur RestDataSource? – Joakim

Répondre

1

Une meilleure façon est définie votre Authorization dynamique comme celui-ci:

@GET("api/event/{id}") 
Observable<Event> getEvent(@Header("Authorization") String authHeader,  
          @Path("id") int id); 

ou dans votre méthode, vous pouvez passer contexte:

public RestDataSource(Context context) { 
    // now you can access your shared preferences 
} 
+0

Si j'utilise la première façon dois-je définir le jeton dans mon constructeur? – zacmwa

+0

vous devez le passer comme si vous passez les données @path – Spartan

0

Vous pouvez passer contexte d'une activité ou d'un fragment dans le constructeur de RestDataSource

public RestDataSource(Context context) { 

        Request request = original.newBuilder().header("Authorization",new SharedPreferencesUtil(context).getToken) 
          .method(original.method(),original.body()) 
          .build(); 

} 

Si vous appelez cette classe d'activité que vous pouvez utiliser

RestDataSource rest=new RestDataSource(this); 

ou si vous utilisez du fragment

RestDataSource rest=new RestDataSource(getActivity());