2017-10-19 3 views
0

ich eine Netzwerkkomponente in meiner app zu injizieren, die mich Nachrüstung meine Aktivitäten & Fragmente injizieren kann, ich es zu meinem Job-Klasse injizieren wollte, ist hier, was ich tatDer Versuch, eine Jobklasse

netComponent Schnittstelle :

@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); 
} 

Und in meinem Job Klasse i es so injizieren:

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; 
    } 
} 

Und der Absturz:

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

Irgendwelche Ideen was soll ich anders machen? Danke an alle Helfer!

UPDATE

Der erste Crash (CCE) war, weil ich getContext tat und warf es auf MyApp, habe ich es zu

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

Jetzt ist der Absturz macht mehr Sinn:

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

Ich überprüft mit dem Debug, injiziert die injection line nicht mRetrofitClient

Irgendwelche Ideen?

NetModule Klasse:

@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

bitte fügen Sie die Nachrüstlogik hinzu. –

+0

hat das ganze Netzmodul hinzugefügt, danke – yanivtwin

+0

Bitte geben Sie die volle Stapelspur Ihrer NPE an – crgarridos

Antwort

1

Managed es zu lösen, indem

void inject(Context cont); 

zu

void inject(LogUploader lp); 

und in dem LogUploader zu

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

Ich habe es vorher ohne getApplicationContext versucht, was der erste Absturz war, nach den Änderungen funktioniert es.

Grundsätzlich muss der inject die Klasse bekommen, die Sie injizieren wollen, egal ob es Aktivitätsfragment oder irgendein anderes ist.