小编Cha*_*ham的帖子

Android Studio Gradle Build需要5分钟以上

所以我一直在Android Studio中开发一个简单的应用程序,自从过去几天,每当我点击"运行"时,构建都需要5分钟以上.它过去并不常见.我不知道为什么.它说"Gradle Build Running"然后在5分钟后加载app.这发生在模拟器和我的Android设备上.我的成绩版本是2.10我查找了这个问题,我已经尝试了其他类似帖子建议的所有内容,包括:

  • 将--parallel和--offline添加到命令行选项设置
  • 在Gradle设置中启用"离线工作"
  • 添加org.gradle.daemon=truegradle.properites文件

以下是截屏.

图片1

图片2

图片3

即使在完成所有这些之后,我的成绩也需要5分钟以上.这就是事件日志中的内容:

10:27:57 AM Executing tasks: [:app:clean, :app:generateDebugSources,     :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies,  :app:generateDebugAndroidTestSources, :app:assembleDebug]
10:34:24 AM Gradle build finished in 6m 26s 378ms
Run Code Online (Sandbox Code Playgroud)

任何建议都会有所帮助.提前致谢 :)

android build.gradle android-gradle-plugin android-studio-2.1

15
推荐指数
2
解决办法
1万
查看次数

格式化秒和分钟

我需要从毫秒开始格式化秒和分钟.我正在使用countdownTimer.有没有人有吸烟?我看着乔达时间.但我需要的是一种格式,所以我有1:05而不是1:5.谢谢

private void walk() {
    new CountDownTimer(15000, 1000) {
        @Override
        public void onFinish() {
            lapCounter++;
            lapNumber.setText("Lap Number: " + lapCounter);
            run();
        }

        @Override
        public void onTick(long millisUntilFinished) {
            text.setText("Time left:" + millisUntilFinished/1000);
        }
    }.start();
}
Run Code Online (Sandbox Code Playgroud)

java format time

12
推荐指数
3
解决办法
2万
查看次数

Gradle Build Failure:无法找到外部类

在尝试构建时,我得到了这个堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException: Couldn't find outer class com/xxx/CheckListPresenter$onAttached$1$5 of com/xxx/CheckListPresenter$onAttached$1$5$1
    at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:1079)
    at com.google.devtools.build.android.desugar.ClassVsInterface.isOuterInterface(ClassVsInterface.java:56)
    at com.google.devtools.build.android.desugar.InterfaceDesugaring.visitOuterClass(InterfaceDesugaring.java:246)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:638)
    at org.objectweb.asm.ClassReader.accept(ClassReader.java:500)
    at com.google.devtools.build.android.desugar.Desugar.desugarClassesInInput(Desugar.java:477)
    at com.google.devtools.build.android.desugar.Desugar.desugarOneInput(Desugar.java:361)
    at com.google.devtools.build.android.desugar.Desugar.desugar(Desugar.java:314)
    at com.google.devtools.build.android.desugar.Desugar.main(Desugar.java:711)
Run Code Online (Sandbox Code Playgroud)

我检查了CheckListPresenter课程,似乎没有任何问题.我尝试删除该类只是为了看它是否会构建,但错误只是转移到另一个类,说明相同的问题.

几个月前我最后一次触摸这段代码是好的,所以我不确定是什么触发了这一变化.

可能重要的事情:这是一个Android项目.这是用Kotlin写的.这在transformClassesWithDesugarForDebuggradle任务上失败


编辑

这些都只是在我尝试的黑暗中刺伤:

  • 创建一个新项目并仅移入我的源代码和gradle文件.

  • 从java 8到7.

  • 不同版本的JDK.我试过1.8.0_151和1.8.0_152.

  • 添加javaMaxHeapSize "4g"到build.gradle.

  • 升级所有内容:gradle包装器和每个依赖项.

  • 删除了Dagger,转而支持Koin

  • 删除了Kapt

  • 同时使用Android Studio的预览版和稳定版

这是我的构建扫描,它会做什么好事

新发现:

这是破坏我的代码片段:

view?.let { v ->
    v.getCancelClicks()
        .doOnSubscribe({ disposables.add(it) })
        .subscribe({
           v.showExitDialog()
              .filter { it }
              .subscribe({
                 cancel()
            }, this::onError)

         }, this::onError)
    }
Run Code Online (Sandbox Code Playgroud)

令人感到奇怪的是,这些没有一个 …

gradle kotlin android-gradle-plugin

12
推荐指数
2
解决办法
1516
查看次数

连接到Firebase的服务是个坏主意?

我正在构建一个需要实时更新的Android应用程序.我的服务器是Firebase.Firebase用于在用户连接到服务器时接收其更新的数据.到目前为止,我对Firebase印象非常深刻,但是我关注的是当应用程序未处于活动状态时接收新数据.我真的不想尝试这些想法,发现它们是个坏主意,因为我的时间很短.我正在寻找建议和意见.

  • 服务(例如).如果用户始终连接,则担心电池消耗并超过我的连接限制.
  • 一个AlarmManager每隔X小时运行一次同步.担心没有足够快地获得更新.
  • 使用GCM推送通知发送痒痒.担心支付另一项服务.

我错过了任何其他建议或可能的问题?谢谢你的时间!

编辑

我找到了这个帖子.仍然不确定.根据詹姆斯·坦普林(怀疑他是Firebase开发者),也许服务并不是一个坏主意

database android firebase

11
推荐指数
1
解决办法
5264
查看次数

带有Presenter的RxJava和用于配置更改的保留片段

我是RxJava的新手,并将其与MVP架构结合使用.

我发现了一些关于使用保留片段在配置更改时保存observable的示例(仍然不确定这是否是最好的方法).我发现的例子是直接在Activity或Fragment上处理observable,而不是从Presenter处理.

所以我试验并设置了这个快速示例(仅使用Reactivex的RxJava和RxAndroid lib)来测试,这似乎工作正常.这个例子的作用是:

  1. 使用无头保留片段启动活动.
  2. 按钮
  3. Presenter调用FakeService以获得延迟(5秒)响应的可观察性.
  4. Presenter对此可观察对象执行.cache().
  5. Presenter告诉视图保留此可观察性.
  6. View将可观察对象保存在保留的片段中.
  7. Presenter订阅了observable.
  8. 用户执行配置更改(设备轮换).用户可以根据需要多次执行此操作.
  9. OnPause告诉Presenter的CompositeSubscription清除和取消订阅所有当前订阅.
  10. 重新创建活动并重用现有的保留片段.
  11. Activity的onResume检查保留的片段的存储的observable是否为null.
  12. 如果不为null,则告诉Presenter订阅它.
  13. 保留的observable被订阅,并且因为.cache被调用,它只是将结果重放给新订阅者而不再调用该服务.
  14. 当Presenter向视图显示最终结果时,它还将保留的片段的已保存observable设置为null.

我想知道我是否正确地执行此操作,并且当在Presenter中处理observable的订阅时,是否有更高效或更优雅的方式来处理配置更改?


编辑:感谢您的反馈.基于此,我已经达到了我认为更清洁的解决方案,并且我已经更新了我的链接示例.

随着新的变化; 而不是将Observable从Presenter传递给Activity到retainFragment以存储一个configurationChange事件,我宁愿将retainFragment设置为Presenter创建时的第二个"视图".

这种方式当onResume()在设备旋转后发生时,我不需要让Activity执行将Observable从retainFragment传递回Presenter的丑陋管道.

Presenter可以直接与第二个"视图"进行交互,并检查保留的observable本身并在需要时重新订阅.主要活动不再需要知道这个可观察的.突然间,这是一个更简单的视图层.

mvp android rx-java rx-android

9
推荐指数
1
解决办法
2843
查看次数

使用Robotium进行Android测试注释

我目前正在Android中构建一个应用程序,并使用Robotium进行功能测试(顺便说一下,不要在没有Android 1.6的情况下使用Robotium,这太麻烦了).

其中一些测试有随机的失败倾向,主要是Robotium缺少文本字段,或超时,而不是阅读文本.我正在尝试使用@FlakyTest注释,因此它们会在抛出失败的测试错误之前运行两到三次.但是,注释不起作用,测试在失败后不会重新运行.

以下是我使用注释的方法:

public class ClassName extends ActivityInstrumentationTestCase2<HomeActivity>{

        @LargeTest
        @FlakyTest(tolerance=3)
        public void testMethod(){

        //Here I run my roboitium scripts.

        }
}
Run Code Online (Sandbox Code Playgroud)

然后我从命令行运行它:

adb shell am instrument -w com.jayway.test/android.test.InstrumentationTestRunner

eclipse和测试的命令行执行都没有考虑到片状测试注释.有没有人看到我试图申请的错误@FlakyTest

android robotium

8
推荐指数
1
解决办法
4232
查看次数

在Android中集成Google Plus时,SERVICE_VERSION_UPDATE_REQUIRED和Google Play服务已过期

我在Android App中集成了Google Plus.我使用的是Android SDK版本4.2.2.但是我在google plus上执行共享帖时遇到了这个错误:

Google Plus服务已过期

ConnectionResult {statusCode = SERVICE_VERSION_UPDATE_REQUIRED,resolution = null}

我想在模拟器上运行Google Plus发布,而不是在设备上运行.

任何帮助将不胜感激.

android posting google-plus google-play-services

8
推荐指数
1
解决办法
1万
查看次数

onChildView和hasSiblings与Espresso

我正在尝试从特定视图访问按钮.相同的视图显示6次.这是我正在使用的代码.

public void testTimeConfig(){
    onData(withDesc("description")).onChildView(withId(R.id.positive)).perform(click());
}

private static Matcher<Object> withDesc(String desc) {
    return allOf(is(instanceOf(String.class)), is(desc));
}
Run Code Online (Sandbox Code Playgroud)

当我跑步时,我收到一个错误:

在视图上执行'加载适配器数据'时出错'可从类中分配:class android.widget.AdapterView'.

这是访问子视图的最佳方式吗?如果是这样,怎么样?

编辑

这是我现在尝试使用的代码.

   onView(allOf((withContentDescription("description")), hasSibling(withContentDescription("SettingsLayout")), hasSibling(withId(R.id.positive)))).perform(click());
Run Code Online (Sandbox Code Playgroud)

   onView(allOf((withContentDescription("description")), hasSibling(withId(R.id.positive)))).perform(click());
Run Code Online (Sandbox Code Playgroud)

出现此错误:

   No views in hierarchy found matching
Run Code Online (Sandbox Code Playgroud)

xml

    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/setAGoalTitle"
        android:layout_alignParentLeft="true"
        class="com.xxx"
        android:layout_marginTop="30dp"
        android:id="@+id/timeGoalWidget"
        app:goalLabel="@string/time_min_upper"
        app:icon="@drawable/ic_icn_summary_time"
        app:step="300"
        app:valueFormat="time"
        android:gravity="center_horizontal"
        android:layout_marginBottom="60dp"
        android:contentDescription="setAGoalTimeConfigurator"/>

    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@id/timeGoalWidget"
        class="com.xxx"
        android:id="@+id/distanceGoalWidget"
        app:goalLabel="@string/distance_upper"
        app:icon="@drawable/ic_icn_summary_track"
        app:step="0.25"
        app:valueFormat="decimal_two"
        android:gravity="center_horizontal"
        android:contentDescription="setAGoalDistanceConfigurator"/>

    <view
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/timeGoalWidget"
        android:layout_alignLeft="@id/timeGoalWidget"
        class="com.xxx"
        android:id="@+id/paceGoalWidget"
        app:goalLabel="@string/pace_upper"
        app:icon="@drawable/ic_icn_summary_pace"
        app:valueFormat="time"
        app:step="10"
        android:gravity="center_horizontal"
        android:layout_marginBottom="60dp"
        android:contentDescription="setAGoalPaceConfigurator"/>


    <view
        android:layout_width="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android hamcrest android-testing android-espresso

8
推荐指数
1
解决办法
2万
查看次数

Android ScrollView中的VerticalScrollExtent是什么?

从我对其他一个问题的回答中,我发现了一个允许项目重新排序的ListView子类Google Demo.

该演示工作得很好,但我很难理解它是如何工作的:当一个项目被拖动到ListView的边界上方/下方时,ListView开始向上/向下滚动以显示新项目.必要的计算使用底层ScrollView的不同参数:

public boolean handleMobileCellScroll(Rect r) {         
    int offset = computeVerticalScrollOffset();
    int height = getHeight();
    int extent = computeVerticalScrollExtent();
    int range = computeVerticalScrollRange();
    int hoverViewTop = r.top;
    int hoverHeight = r.height();       

    if (hoverViewTop <= 0 && offset > 0) {
        smoothScrollBy(-mSmoothScrollAmountAtEdge, 0);
        return true;
    }

    if (hoverViewTop + hoverHeight >= height && (offset + extent) < range) {
        smoothScrollBy(mSmoothScrollAmountAtEdge, 0);
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)
  • height是ListView本身的高度
  • offset是滚动位置=向上/向下滚动了多少单位/像素
  • range是完整内容的高度.
  • extent …

android listview android-listview android-scrollview

8
推荐指数
2
解决办法
3220
查看次数

遍历@IntDef,@ StringDef或任何@Def类中的值

考虑这个课程:

public class MyClassOfMystery {

    public static final int NO_FLAGS = ~0;
    public static final int FIRST_FLAG = 1;
    public static final int SECOND_FLAG = 1 << 1;
    public static final int THIRD_FLAG = 1 << 2;
    public static final int FOURTH_FLAG = 1 << 3;

    @Retention(RetentionPolicy.SOURCE)
    @IntDef(flag = true, value = {NO_FLAGS, FIRST_FLAG, SECOND_FLAG, THIRD_FLAG, FOURTH_FLAG})
    public @interface MysteryFlags { }

   ... set flags, get flags, and use flags stuff.
}
Run Code Online (Sandbox Code Playgroud)

我经常创建这样的东西,并发现能够遍历所有可用的标志是有用的MysteryFlags.

我可以遍历设置的值MysteryFlags吗?

这是我尝试过的:


这印刷 …

java bitflags

8
推荐指数
1
解决办法
5212
查看次数