2017-02-03 7 views
9

У меня возникли проблемы с попыткой получить внешний проект Java, чтобы я мог также использовать классы Android. Библиотека уже интегрирована в проект Android. Например: у меня есть несколько классов моделей, которые я бы хотел реализовать Parcelable, поэтому они могут быть сериализованы соответственно, но ни один из классов Android не доступен на них.Интеграция внешней чистой библиотеки Java и наличие на ней классов Android

Разъяснение Я сделал только это для того, чтобы попытаться решить проблему

До сих пор я только пробовал:

  • Изменение и согласование пакета внешнего библиотеки:

Наименование пакета в Android

com.domain.androidproject

пакет библиотеки первоначально

com.domain.libproject

Изменен:

com.dommain.androidproject.libproject

Но не повезло до сих пор. Я импортировал библиотеку в качестве внешнего проекта Gradle vía:

compile project(path: ':LibProject') 

Благодарим за помощь.

+3

Неясная на вопрос ... почему бы вам нужно изменить имена пакетов на всех? Это внешняя зависимость, поэтому почему вы не можете просто импортировать ее и использовать? –

+0

Потому что я сделал это так, но не работал – Chisko

+0

Что значит, что это не сработало? Что случилось, когда вы пробовали? То, что предложил Кристофер, - это правильный путь для этого, и если у вас есть проблемы с этим, это проблема, которую вы должны решить (решить проблему в ее ядре), а не создавать кучу мостов и оберток. –

ответ

-2

Вообще, если вы хотите использовать классы в другом проекте/библиотеки:

Файл -> Новый -> Импорт модуля -> Перейдите в каталог старого проекта/Library -> Ok

Отключите модули, которые хотите импортировать, -> OK

Щелкните правой кнопкой мыши модуль приложения -> Открыть настройки модуля -> зависимости -> + -> Модуль -> Новый модуль.

Ваш проект затем должен использоваться в любом проекте, который вы только что сделали.

+0

Пожалуйста, дайте мне знать, если я не буду правильно объяснять вопрос. Я хочу, чтобы иметь возможность использовать классы Android внутри этого проекта, а не наоборот. – Chisko

+1

Наборы для разработки, вероятно, предотвратят это. Когда Java построена вокруг jdk, android построен вокруг android sdk, который включает jdk. Таким образом, вы можете реализовать java в проекте Android, но не специфичный для Android код в библиотеке Java, не настраивая среду для использования Android. Из любопытства, что заставляет вас это делать? – KoalaKoalified

+0

Как я уже сказал, я хочу, чтобы модельные классы из этого проекта могли использовать «Parcelable». Проект уже импортирован и живет в своем собственном каталоге, но я не могу импортировать какие-либо классы из Android внутри него. Я знаю, что просто просто скопировать эти классы в каталог модуля, но я думаю, что это было бы непрактично. – Chisko

9

Вам необходимо определить привязку между вашей чистой библиотекой java и андроидом. Вы можете использовать инъекцию зависимостей, чтобы вводить модели с использованием подписи класса, а затем определять возможные модели внутри приложения (или в другой проект, например, плагин). Или вы можете добиться того же, используя дженерики. имейте в виду, поскольку java-библиотека уже скомпилирована, технически вы не можете ее изменить, импортировав ее в проект Android (я видел, как люди «переписывали» некоторые файлы из зависимости, а затем добавляли их со всем исходным путем чтобы обмануть путь класса, но это очень рискованно, так как вы не сможете взаимодействовать с остальным кодом зависимостей, и если что-то изменится, вещь сломается).

Если у вас есть доступ к исходному коду библиотеки pure java, измените его, чтобы использовать фабрики или поставщики моделей. Если нет, расширьте модели, добавьте детальную поддержку и попытайтесь использовать их вместо исходных классов моделей.

Пример:

давайте предположим, что у нас есть модель и некоторые функции, используя его:

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 
} 

Теперь в андроида проекте:

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

} 

Теперь в андроида проекте, вы можете использовать посыльный подкласс повсюду, и каждый раз, когда вам нужно вызвать библиотеку, вы можете предоставить интерфейс создателя, используя parcelables в качестве аргументов. Другой альтернативой может быть изменение сигнатуры метода библиотеки к чему-то вроде этого:

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

Таким образом, вы можете непосредственно потреблять parcelable подклассы. Но в зависимости от вашей иерархии это может быть невозможно. Наконец, вы можете попытаться внедрить инъекцию зависимостей в проект java, используя Guice и Roboguice в проекте android. Поскольку roboguice использует guice, возможно, они могут взаимодействовать, но это длинный снимок.

+0

Спасибо за ваши данные. Библиотека не скомпилирована, у меня есть исходный код и вы можете изменить его по своему усмотрению. Но то, что вы описываете, звучит ужасно сложно, чтобы заставить класс реализовать интерфейс. Я был бы признателен, если бы вы описали дальше или указали мне на то, где я могу это проверить. – Chisko

+0

Чтобы уточнить: я понимаю вашу вторую мысль, но не первый – Chisko

+0

Я попробую это сегодня и дам вам знать. Спасибо – Chisko

-2

Создать андроид проект библиотеки с PACKAGENAME com.domain.libproject

Скопируйте все источники в папке Src.

Обновление jar-зависимостей в build.gradle, после чего вы можете сделать свой класс в библиотеке дополнительным.

Дайте мне знать, если возникнут проблемы.

Лучшие regds

1

Мне нравится Fco P. «s ответ, но ради Комплектность, вот альтернативный ответ.

Используйте json для сериализации объектов, а не Parcelable. Затем вы можете поместить свой сериализованный json в строку в виде намерения или как строку в связках.

  • это быстрее реализовать, чем при использовании Parcelable, с библиотеками, такими как Google GSON или Square moshi.
  • это менее производительным, чем Parcelable
+0

Как мне обойтись с помощью 'Bundle.putParcelable()' с вашим ответом? – Chisko