Search code examples
androidandroid-gradle-pluginrx-java2rx-android

Libraries included in custom library not usable/visible in sample project Android


i'm creating simple library which make call to weather api, in my lib-project i use RxJava and RxAndroid and retrofit for http calls. My WeatherService make the call and receive result as json and need to make some manipulations and return it as Single<CurrentWeather> to the client app. In my lib-project i add to gradle all needed dependencies for rx and retrofit.

My library gradle:

ext{
    rxJava = "2.1.17"
    rxAndroid = "2.0.2"
    support = "27.1.1"
    retrofitVersion = "2.4.0"
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation "com.android.support:appcompat-v7:$support"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation "com.squareup.retrofit2:retrofit:$retrofitVersion"
    implementation "com.squareup.retrofit2:converter-gson:$retrofitVersion"
    implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"

    implementation "io.reactivex.rxjava2:rxandroid:$rxAndroid"
    implementation "io.reactivex.rxjava2:rxjava:$rxJava"
}

Now in my sample app in MainActivity i wanted to test one function to see if it works as expected, but when i try call the function which return Single it show comlpile error:

error: cannot access Single
class file for io.reactivex.Single not found

lib function declaration:

public Single<Current> getCurrentWeather(double lat, double lng) {
    return mClient.getWeather(lat + "," + lng).flatMap(new Function<JSONObject, SingleSource<Current>>() {
      @Override
      public SingleSource<Current> apply(JSONObject jsonObject) throws Exception {
        //parse jsonObject and return as Single<Current>

        return Single.create(new SingleOnSubscribe<Current>() {

          @Override
          public void subscribe(SingleEmitter<Current> emitter) throws Exception {
            Current current = new Current();
            emitter.onSuccess(current);
          }
        });
      }
    });
  }

Client app MainActivity: Here i have the compile error.

WeatherService.getIsnstance().getCurrentWeather(32.5554, 35.545)

Client app gradle:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation project(":weatherlib")
}

Client app settings.gradle:

include ':app', ':weatherlib'

Do i miss something here ?

Do this means that everyone who will wish to use this lib will have to add rx dependencies in their gradle too?


Solution

  • You need to use api instead of implementation for your library's dependencies.

    See here for the difference between them.