2017-02-03 11 views
9

Mam problemy z pobieraniem zewnętrznego projektu Java, więc mogę również używać klas Androida. Biblioteka jest już zintegrowana z projektem Android. Na przykład: Mam kilka klas modeli, które chciałbym wdrożyć Parcelable, aby można je było odpowiednio serializować, ale żadna z klas Android nie jest dostępna na nich.Integrowanie zewnętrznej biblioteki czystej Javy i dostęp do klas aplikacji z Androidem

Wyjaśnienie ja tylko zrobiłem to, aby spróbować rozwiązać problem

Do tej pory mam tylko próbowałem:

  • Zmiana i dopasowanie pakietu biblioteki zewnętrznego:

Nazwa pakietu w systemie Android:

com.domain.androidproject

pakiet Biblioteki pierwotnie

com.domain.libproject

zmienione na:

com.dommain.androidproject.libproject

ale nie szczęścia tak daleko. Zaimportowałem bibliotekę jako zewnętrzny projekt Gradle vía:

compile project(path: ':LibProject') 

Dziękuję za pomoc.

+3

Niejasne na pytanie ... dlaczego trzeba zmienić nazwy pakietów w ogóle? To jest zewnętrzna zależność, więc dlaczego nie możesz jej po prostu zaimportować i użyć? –

+0

Ponieważ zrobiłem to w ten sposób, ale początkowo nie działałem – Chisko

+0

Co masz na myśli, że to nie zadziałało? Co się stało, kiedy próbowałeś? Christopher zasugerował, że jest to właściwy sposób postępowania, a jeśli masz z tym jakiś problem, to jest to problem, który powinieneś rozwiązać (rozwiązując problem w jego rdzeniu), zamiast tworzyć kilka mostków i opakowań. –

Odpowiedz

-2

Generalnie, jeśli chcesz skorzystać z zajęć w innym projekcie/Library:

File -> New -> Moduł importu -> Przejdź do katalogu, w starej projektu/Library - Ok>

Sprawdź moduły, które chcesz zaimportować -> OK

Kliknij prawym przyciskiem moduł aplikacji -> Otwórz ustawienia modułu -> zależności -> + -> Moduł -> Nowy moduł.

Twój projekt powinien następnie nadawać się do użycia w każdym projekcie, który właśnie zrobiłeś.

+0

Proszę dać mi znać, jeśli nie wyjaśniam się poprawnie na pytanie. To, czego chcę, to móc korzystać z klas Android w tym projekcie, a nie na odwrót. – Chisko

+1

Zestawy rozwojowe prawdopodobnie temu zapobiegną. Gdy Java jest zbudowana wokół jdk, android jest zbudowany wokół androida SDK, który zawiera jdk. Możesz więc zaimplementować java w projekcie Android, ale nie w systemie Android, w bibliotece Javy bez konieczności konfigurowania środowiska do korzystania z Androida. Z ciekawości, co sprawia, że ​​chcesz to robić? – KoalaKoalified

+0

Tak jak powiedziałem, chcę, aby klasy modelu z tego projektu mogły korzystać z "Parcelable". Projekt jest już zaimportowany i działa w swoim własnym katalogu, ale nie mogę importować żadnych klas z Androida. Wiem, że po prostu łatwiej jest skopiować te klasy do katalogu modułów, ale myślę, że nie byłoby to praktyczne. – Chisko

9

Będziesz musiał zdefiniować powiązanie między swoją czystą biblioteką Java a Androidem. Możesz użyć iniekcji Dependency, aby wstrzyknąć modele przy użyciu podpisu klasy, a następnie zdefiniować modele działek wewnątrz aplikacji (lub innego projektu, na przykład wtyczki). Lub można osiągnąć to samo za pomocą generycznych. miej na uwadze, ponieważ biblioteka Java jest już skompilowana, technicznie, nie możesz jej zmienić poprzez zaimportowanie jej do projektu androida (widziałem, jak ludzie "przepisują" niektóre pliki z zależności, a następnie dodawali je do całej oryginalnej ścieżki oszukać klasę, ale to bardzo ryzykowne, ponieważ nie będziesz w stanie wchodzić w interakcje z resztą kodu zależności, a jeśli coś się zmieni, sprawa się zepsuje).

jeśli masz dostęp do kodu źródłowego czystej biblioteki Java, a następnie zmodyfikuj go, aby używać fabryk lub dostawców modeli. Jeśli nie, rozszerz modele, dodaj obsługę działek i używaj ich zamiast oryginalnych klas modeli.

Przykład:

załóżmy, że mamy model i niektórych funkcji używając go:

public class myModel{ 

    private int id; 
    private String name; 

    public void setId(int id){ 
     this.id = id; 
    } 

    //more getters and setters 
} 

public interface myModelCreator<T>{ 
    public myModel create(T toModel); 
    public T uncreate(myModel fromModel); 
} 

public static void doSomething(myModel model){ 
    //some library operations 
} 

Teraz w Android projektu:

public class myAndroidModel extends myModel implements Parcelable{ 
    /*Implements the parcelable methods using the class accessors, or you can change the myModel members to protected.*/ 
} 

public class myAndroidModelCreator implements myModelCreator<myAndroidModel>{ 

    @Override 
    public myModel create(myAndroidModel toModel){ 
     //create the myModel using the parcelable class. 
    } 

    @Override  
    public myAndroidModel uncreate(myModel fromModel){ 
     //reverse operation. 
    } 

} 

Teraz w Android projektu, możesz korzystać z podklasy rozwijanej wszędzie, a za każdym razem, gdy potrzebujesz wywołać bibliotekę, możesz dostarczyć interfejs twórcy, używając parcelables jako argumentów. Inną alternatywą byłoby zmienia podpisy metoda biblioteki do czegoś takiego:

public static void<T extends myModel> doSomething(T model){ 
    //some library operations 
} 

Więc można bezpośrednio zużywają parcelable podklasy. Ale w zależności od hierarchii może to nie być możliwe. Na koniec możesz spróbować zaimplementować wtrysk zależności w projekcie Java za pomocą Guice i Roboguice w projekcie Android. Ponieważ roboguice używa guice, możliwe jest, że mogą współpracować, ale to jest długie ujęcie.

+0

Dziękuję za twoje dane wejściowe. Biblioteka nie jest skompilowana, mam kod źródłowy i mogę ją dowolnie zmieniać. Ale to, co opisujesz, brzmi okropnie skomplikowanie tylko po to, aby klasa implementowała interfejs. Byłbym wdzięczny, gdybyś opisał dalej lub wskazał mi opiekuna, gdzie mogę to sprawdzić. – Chisko

+0

Aby wyjaśnić: Rozumiem twoją drugą myśl, ale nie pierwszą. – Chisko

+0

Wypróbuję to dzisiaj i dam ci znać. Dzięki – Chisko

-2

Załóż android projektu biblioteki z nazwa_pakietu com.domain.libproject

skopiować wszystkie źródła w katalogu src.

Zaktualizuj zależności JAR w pliku build.gradle, a następnie przekształć klasę w działkę biblioteki.

Daj mi znać, jeśli wystąpią jakiekolwiek problemy.

Najlepsze regds

1

Lubię Fco P. jest odpowiedź, ale w trosce o kompletności, tutaj jest alternatywnym rozwiązaniem.

Użyj json do serializowania obiektów, a nie Parcelable. Następnie możesz umieścić swój serializowany json jako ciąg dodatkowy w intencji lub jako ciąg w pakietach.

  • to szybsze wdrożenie niż przy użyciu Parcelable z bibliotek takich jak Google GSON lub Square moshi.
  • to mniej wydajnych niż Parcelable
+0

Jak obejść przy użyciu 'Bundle.putParcelable()' z odpowiedzi? – Chisko

Powiązane problemy