Неудачная сборка Gradle с пользовательским тегом XML и привязкой данных
Я получаю ошибку сборки, описанную ниже, когда пытаюсь запустить проект с использованием привязки данных и пользовательского тега XML в связанном макете:
Планировка:
<data>
<variable
name="data"
type="com.melontech.sff.viewmodel.DataViewModel" />
</data>
...
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/placeholder_img"
app:imageUrl="@{data.imageUrl}" />
...
View Model имеет следующий Binding адаптер:
@BindingAdapter("bind:imageUrl")
public static void getImageUrl(ImageView imageView, String url) {
Timber.d("LOAD IMAGE WITH URL %s", url);
}
Код, который создает ViewHolder и делает привязку, следующий:
@Override
public ModelViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ModelListItemBinding binding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.model_list_item, parent, false);
return new ModelViewHolder(binding);
}
Ошибка сборки:
Error:Execution failed for task ':app:transformJackWithJackForDebug'.
com.android.jack.ir.JNodeInternalError: java.lang.Exception: java.lang.RuntimeException: ошибка, подробности см. в журналах. не может сгенерировать связующие элементы представления java.lang.IllegalArgumentException: элемент public по умолчанию java.util.stream.IntStream codePoints() не является членом содержащего типа java.lang.String и ни одного из его суперклассов в com.android.jack.eclipse.jdt.internal.compiler.apt.model.TypesImpl.asMemberOf(TypesImpl.java:129) в android.databinding.tool.reflection.annotation.AnnotationMethod.(AnnotationMethod.java:49) в android.databinding.noolf.AnnotationClass.getDeclaredMethods(AnnotationClass.java:314) в android.databinding.tool.reflection.ModelClass.getAbstractMethods(ModelClass.java:401) в android.databinding.tool.expr.MethodBaseExprersj android.databinding.tool.expr.FieldAccessExpr.resolveListeners(FieldAccessExpr.java:131) в android.databinding.tool.Binding.resolveListeners(Binding.java:65) в android.databinding.tool.BindingTarget.resolveListeners(BindingTarget.jpg 164) на android.databinding.tool.LayoutBinder.(LayoutBinder.java:250) в android.databinding.tool.DataBinder.(DataBinder.java:52) в android.databinding.tool.CompilerChef.ensureDataBinder(CompilerChef.java:88) в android.databinding.tool.CompilerChef.sealModels(CompilerChef.java:187) в android.databinding.annotationprocessor.ProcessExpressions.writeResourceBundle(ProcessExpressions.java:184) в android.databinding.annotationprocessor.ProcessExpressions.onHandleStep(ProcessExpressions.java:86) в android.cesscessDordering$ android. ProcessingStep.runStep(ProcessDataBinding.java:189) в android.databinding.annotationprocessor.ProcessDataBinding$ProcessingStep.access$000(ProcessDataBinding.java:174) в android.databinding.annotationprocessor.ProcessDataBinding.process(processDB).android.jack.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:139) в com.android.jack.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(Round her.java:121) на com.android.jack.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:159) на com.android.jack.eclipse.com.jpt.Compiler.processAnnotations(Compiler.java:909) в com.android.jack.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:434) в com.android.jack.frontend.java.JAstBuilder.compile(JAstBuilder.java:269) в com.android.jack.frontend.java.JackBatchCompiler.performCompilation(JackBatchCompiler.java:219) в com.android.jack.eclipse.jdt.internal.compiler.batch.Main.compile(Main. Java:1712) на com.android.jack.frontend.java.JackBatchCompiler.compile(JackBatchCompiler.java:184) на com.android.jack.Jack.buildSession(Jack.java:1052) на com.android.jack.Jack..run(Jack.java:540) в com.android.jack.api.v01.impl.Api01ConfigImpl$Api01CompilationTaskImpl.run(Api01ConfigImpl.java:124) в com.android.builder.core.JackToolchainTool:310) на com.android.builder.core.JackToolchain.convertUsingApis(JackToolchain.java:189) в com.android.builder.core.JackToolchain.convert(JackToolchain.java:170) в com.android.build.gradle.internal.transforms.JackTransform.runJack(JackTransform.java:230) на com.android.build.gradle.internal.transforms.JackTransform.transform(JackTransform.java:198) на com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:185) на com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:181) на com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102) на com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:176) в sun.reflect.GeneratedMethodAccessor311.invoke(Неизвестный источник) в sun.reflect.DelegatingMethodAccessorImpl.invoke.java при получении (делегирование).lang.reflect.Method.invoke(Method.java:498) в org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73) в org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:163) в org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTject.grag.jpg) atg.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecution.gra..gra..g.in.gra.j.95).ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55) в org.graternaltiontk.in SkipUpToDateTaskExecuter.java:62) в org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) в org.gradle.api.internal.tasks.execution.Skip Исходные_файлы SkipTaskWithNoActionsExec. 43) в org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) в org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.exjG2.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228) в org.gradle.internal.Transformers$4.transform(Transformers.java:169) в org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106) по адресу org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61) по адресу org.gradle.execuraphTecTecFecTecKef.Dec DefaultTaskGraphExecuter.java:228) в org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215) в org.gradle.execution.teckgraph.AbstractTeck.Exec.Secutor.Plan.Exlan.gradle.execution.taskgraph. (DefaultTaskGraphExecuter.java:113) в org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37) в org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37) по адресу org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23) по адресу org.gradle.execution.DefaultBuildExecuter$1.proceed.Bjildjecuter $ 1.proceed) в org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) в org.gradle.execution.DefaultBuildExecuter.execute (DefaultBuildExecuter.java:37) в org.gradle.exjildildExexildildExterterte) в org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196) в org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193) в org.gradle.forforrans ($ 4)..java: 169) в org.gradle.internal.progress.DefaultBuildOperationExecutor.run (DefaultBuildOperationExecutor.java:106) в org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56) в org.grag.DefaultGradleLauncher..exec.GradleBuildController.run(GradleBuildController.java:71) в org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:50) в org.gradle.launun.java:35) в org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner$1.execute(RunAsBuildOperationBuildActionRunner.java:43) в org.gradle.tooling.internal.provide.RunnerAun:40) в org.gradle.internal.Transformers$4.transform(Transformers.java:169) в org.gradle.internal.progress.DefaultBuildOperationExecutor.run (DefaultBuildOperationExecutor.java:106) в org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56) в org.gradle.tooling.internal.provider.runner.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.olin.grain.grain.grade.grain.grade.grain.gr..SubscribeableBuildActionRunner.run(SubscribeableBuildActionRunner.java:75) по адресу org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) по адресу org.gradle.launcher.exec.InProcessBaseExec org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26) в org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.javainggra.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49) в org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)) в org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29) в org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild.doBuild.java:67gra: launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) в org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) в org.grade server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47) в org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) в org.gradle.launcher.daemon.ver.exe ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26) в org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) в org.gradle.estuncher.daemon.SedeSueEdusedSecuDestopSudeSodeDesteSudeStedeSteE RequestStopIfSingleUsedDaemon.java:34) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) в org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74) в org.gradle.launcher.daemon.server.exec.ForwardClientInput $ 2. вызов (ForwardClientInput.java:72) в org.gradle.util.Swapper.swap(Swapper.java:38) в org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72) в org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) в org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.javaher) at.daemon.server.api.DaemonCommandExecution.proceed (DaemonCommandExecution.java:120) в org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60) в org.gradle.launcver.e.exec.BuildCommandOnly.execute (BuildCommandOnly.java:36) в org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120) в org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72) в org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36) в org.gradle.launcher.emon. api.DaemonCommandExecution.proceed (DaemonCommandExecution.java:120) в org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50da.one.ser.. Выполните (DaemonStateCoordinator.java:297) в org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54) в org.gradle.internal.concurrent.StoppableExecutorImpl.unj java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) в java.lang.Thread.run(45).
Привязка данных включена в файле Gradle.
Если я перенесу эту функцию в отдельный чистый проект и привяжу данные следующим образом:
ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
Пользовательские атрибуты XML работают, как ожидалось, и сборка прошла успешно.
У вас есть идеи, что может быть причиной ошибки сборки?
4 ответа
Jd Prajapati вот мой класс ViewModel:
public class DataViewModel {
private Data data;
public DataViewModel() {
}
public DataViewModel(Data data) {
this.data = data;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
public String getTitle() {
if (data != null) {
if (!TextUtils.isEmpty(data.getTitle())) {
return data.getTitle();
}
}
//Case when title doesn't exist
return "";
}
public String getImageUrl() {
if (data != null) {
if (!TextUtils.isEmpty(data.getMainPic())) {
return data.getMainPic();
}
}
//Case when poster url doesn't exist
return "";
}
@BindingAdapter("imageUrl")
public static void getImageUrl(ImageView imageView, String url) {
Timber.d("LOAD IMAGE WITH URL %s", url);
}
}
Кстати, я нашел способ заставить Gradle построить проект, изменив свойство ImageView на следующее:
<ImageView
android:id="@+id/movie_poster"
android:layout_width="@dimen/dim_160dp"
android:layout_height="@dimen/dim_240dp"
android:src="@mipmap/movie_placeholder_img"
app:imageUrl="@{singleMovie.getImageUrl()}" />
Я столкнулся с той же проблемой, с которой вы столкнулись. Но я нашел решение для привязки, а не вызывать getImageUrl напрямую.
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/placeholder_img"
app:imageUrl="@{data.imageUrl}" />
@BindingAdapter("bind:imageUrl")
public static void getImageUrl(ImageView imageView, Object url) {
Timber.d("LOAD IMAGE WITH URL %s", (String) url);
}
Используйте Object вместо String. Тогда это будет работать. Может быть, это ошибка привязки или гнезда.
Попробуйте так...
@BindingAdapter("imageUrl")
public static void getImageUrl(ImageView imageView, String url) {
Timber.d("LOAD IMAGE WITH URL %s", url);
}
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/placeholder_img"
tools:imageUrl="@{data.imageUrl}" />
Я думаю, что вы пытаетесь использовать Java 8
особенности и Data Binding
все вместе. Когда вы добавляете
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
а также Jack Compiler
jackOptions {
enabled true
}
в ваш проект вы получаете эту ошибку с пользовательским атрибутом.
Google говорит:
В соответствии с этим объявлением, набор инструментов Jack не рекомендуется. Если ваш проект зависит от Джека, вы можете продолжать использовать его. Тем не менее, он может быть полностью удален в будущем предварительном выпуске Android Studio 2.4. Поэтому мы рекомендуем отключить Jack и использовать поддержку Java 8, встроенную в стандартный набор инструментов Android Studio.
Вот официальный документ: https://developer.android.com/studio/preview/features/java8-support.html
Если вы просто используете его для RetroLambda
вы можете перенести его, как показано ниже, не включая Jack
,
buildscript {
...
dependencies {
// Remove the following dependency.
classpath 'me.tatarka:gradle-retrolambda:<version_number>'
}
}
И в вашем приложении Gradle:
apply plugin: 'me.tatarka.retrolambda'
И для второго пути; Как уже упоминалось, вы можете изменить Binding Adapter
как следующий код:
@BindingAdapter("imageUrl")
public static void getImageUrl(ImageView imageView, Object url) {
Timber.d("LOAD IMAGE WITH URL %s", (String)url);
}
Это также будет работать для вас. Удачи.