2017-10-19 7 views
0

J'ai un composant réseau dans mon application qui me permet d'injecter retrofit à mes activités & fragments, je voulais injecter à ma classe d'emploi, voici ce que je l'ai faitEssayer d'injecter à une classe d'emploi

Interface NetComponent :

@Singleton 
@Component(modules={AppModule.class, NetModule.class}) 
public interface NetComponent { 
    void inject(MainActivity activity); 
    void inject(SplashActivity activity); 
    void inject(RegisterActivity activity); 
    void inject(SettingsFragment fragment); 
    void inject(Context cont); // also tried void inject(Job job); 
} 

Et dans ma classe d'emploi i injectent comme ceci:

public class LogUploader extends Job { 
    public static final String TAG = "UPLOAD_LOGS" ; 
    @Inject 
    Retrofit mRetrofitClient; 
    @Override 
    @NonNull 
    protected Result onRunJob(Params params) { 
     ((MyApp) getContext()).getNetComponent().inject(getContext()); 

     // run your job here 
     Log.e("LogFile", " "+ TAG); 
     //// TODO: 10/18/2017 send log 
     checklogs(this.getContext()); 
     //// TODO: 10/18/2017 get phone db update 
     return Result.SUCCESS; 
    } 
} 

Et l'accident:

ClassCastException: com.evernote.android.job.v21.PlatformJobService cannot be cast to com.**.**.Application.MyApp 

Des idées que dois-je faire différemment? Merci à toutes les aides!

MISE À JOUR

Le premier accident (CCE) parce que je l'ai fait getContext et jeté à MyApp, je l'ai changé

((MyApp) this.getContext().getApplicationContext()).getNetComponent().inject(getContext()); 

Maintenant, l'accident est plus logique:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object retrofit2.Retrofit.create(java.lang.Class)' on a null object reference 

J'ai vérifié avec le débogage, la ligne d'injection n'injecte pas mRetrofitClient

Des idées?

classe NetModule:

@Module 

public class NetModule { 
    String mBaseUrl; 

    // Constructor needs one parameter to instantiate. 
    public NetModule(String baseUrl) { 
     this.mBaseUrl = baseUrl; 
    } 

    // Dagger will only look for methods annotated with @Provides 
    @Provides 
    @Singleton 
    // Application reference must come from AppModule.class 
    SharedPreferences providesSharedPreferences(Application application) { 
     return PreferenceManager.getDefaultSharedPreferences(application); 
    } 

    @Provides 
    @Singleton 
    Cache provideOkHttpCache(Application application) { 
     int cacheSize = 10 * 1024 * 1024; // 10 MiB 
     Cache cache = new Cache(application.getCacheDir(), cacheSize); 
     return cache; 
    } 

    @Provides 
    @Singleton 
    Gson provideGson() { 
     GsonBuilder gsonBuilder = new GsonBuilder(); 
     gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE); 

     return gsonBuilder.create(); 
    } 

    @Provides 
    @Singleton 
    OkHttpClient provideOkHttpClient(Cache cache) { 
     OkHttpClient client = new OkHttpClient().newBuilder().cache(cache).build(); 
     return client; 
    } 

    @Provides 
    @Singleton 
    Retrofit provideRetrofit(Gson gson, OkHttpClient okHttpClient) { 
     Retrofit retrofit = new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create(gson)) 
       .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 

       .baseUrl(mBaseUrl) 
       .client(okHttpClient) 
       .build(); 
     return retrofit; 
    } 
} 
+0

s'il vous plaît ajouter vous retrofit fournir une logique. –

+0

ajouté le module net entier, merci – yanivtwin

+0

s'il vous plaît fournir la trace de la pile complète de votre NPE – crgarridos

Répondre

1

réussi à résoudre en changeant

void inject(Context cont); 

à

void inject(LogUploader lp); 

et dans le LogUploader à

 ((MyApp) this.getContext().getApplicationContext()).getNetComponent().inject(this); 

Je l'ai essayé avant sans le getApplicationContext qui était le premier plantage, après que les changements cela fonctionne.

Fondamentalement, l'injection doit obtenir la classe que vous souhaitez injecter n'a pas d'importance si c'est Fragment d'activité ou tout autre.