小编Sto*_*yan的帖子

Android Gradle构建子项目

我目前正在将我们的一个项目从maven转换为Gradle.文件夹结构如下:

gitRoot
    settings.gradle
    build.gradle
    ProjectA
        build.gradle
        src/main/java
    Libraries
        SomeLib (git submodule)
        ProjectBRoot (git submodule)
            settings.gradle
            build.gradle
            ProjectB
                build.gradle
                src/main/java
            Libraries
                FacebookSDK/facebook
                    build.gradle
                    src
Run Code Online (Sandbox Code Playgroud)

所以看起来已经很复杂了.但是这个想法是ProjectB是一个图书馆项目,它应该能够单独构建和打包,这就是为什么它有自己的settings.gradle,据我所知它似乎工作正常,我有它建设并且它发现facebook就好了.

ProjectB/build.gradle包含此行

compile project(':libraries:facebook-android-sdk:facebook')
Run Code Online (Sandbox Code Playgroud)

ProjectBRoot/settings.gradle包含此行

include ':ProjectB', ':libraries:facebook-android-sdk:facebook'
Run Code Online (Sandbox Code Playgroud)

gitRoot/settings.gradle包含此行

include ':ProjectA', ':Libraries:ProjectBRoot:ProjectB'
Run Code Online (Sandbox Code Playgroud)

ProjectA/build.gradle包含此行

compile project(':Libraries:ProjectBRoot:ProjectB')
Run Code Online (Sandbox Code Playgroud)

当我运行构建时,我收到此错误

The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.

FAILURE: Build failed with an exception.

* Where:
Build file '/gitRoot/Libraries/ProjectBRoot/ProjectB/build.gradle' line: 17

* What went wrong:
A problem occurred …
Run Code Online (Sandbox Code Playgroud)

android gradle facebook-android-sdk

54
推荐指数
2
解决办法
7万
查看次数

使用双计数器在Java中进行同步

我有一个奇怪的同步架构,我正在寻找一个优雅的解决方案.我已经有了一个解决方案,但我不能说它的有效性,也有点难看.所以这是问题,希望有人可以帮助我.

有两组任务可以启动和运行.每个任务都有自己的线程.这两个组都从一个负责同步部分的超类扩展.为简单起见,我将这两个组称为A组和B组.

条件:

  • 如果只有B组任务在运行,那么它们可以同时运行,并且它们不会相互干扰.

  • 如果启动了组A任务*,则组B任务的构造函数应该失败并出现异常.即使A组任务已在运行,也可以创建任意数量的A组任务

  • 在所有当前的B组任务完成之前,A组任务无法执行.(*从上面)

  • 一次只能运行1个A组任务.他们必须排队.(只要先前的条件仍然适用,可以选择在运行两个A组任务之间阻止B组任务)

我相信我的方法有效但我不喜欢它的工作方式,因为它使用了许多不同的同步点,以及我在等待计数器时有一个睡眠的事实.无论如何,代码如下

public abstract class LockableTask<Params> extends AsyncTask {

private final boolean groupA;
private static Boolean locked = false;
private static final Semaphore semLock = new Semaphore(1);
private static int count = 0;

public LockableTask(boolean groupA) {
    this.groupA = groupA;
    synchronized (locked) {
        if (locked && !groupA) {
            throw new InputException("We are locked, please wait");
        }
    }
}

@Override
protected final AsyncReturn doInBackground(Params... params) {
    if (!groupA) {
        synchronized (locked) {
            count++;
        }
    } …
Run Code Online (Sandbox Code Playgroud)

java multithreading synchronization thread-safety

0
推荐指数
1
解决办法
386
查看次数