小编Vas*_*liy的帖子

ConstraintLayout - 如何垂直对齐两个视图的中心

我有两个观点--A和B.他们有不同的高度.

如何垂直对齐这些视图的中心ConstraintLayout

例如,在下面的XML中,我希望中心img_change_picture与中心对齐txt_change_picture.

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
>

<android.support.constraint.Guideline
    android:id="@+id/guideline_icons"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.1"/>

<android.support.constraint.Guideline
    android:id="@+id/guideline_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.2"/>

<ImageView
    android:id="@+id/img_change_picture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toEndOf="@id/guideline_icons"
    app:layout_constraintTop_toBottomOf="@id/img_header"
    android:layout_marginTop="@dimen/settings_main_vertical_spacing"
    app:srcCompat="@drawable/change_picture"/>

<TextView
    android:id="@+id/txt_change_picture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toEndOf="@id/guideline_text"
    android:text="@string/settings_main_change_picture"
    />

</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

android android-constraintlayout

4
推荐指数
2
解决办法
6327
查看次数

为什么和如何Kotlin协程防止线程阻塞,即使没有“ suspend”关键字也是如此?

在Android应用中使用协程时遇到了一些意外行为。

假设我有以下功能,它不是“挂起”。它启动工作线程,并应阻塞调用线程,直到所有工作线程终止:

fun doSomething() : Result {

    // producers init thread
    Thread {
        for (i in 0 until NUM_OF_MESSAGES) {
            startNewProducer(i) // each producer is a thread
        }
    }.start()

    // consumers init thread
    Thread {
        for (i in 0 until NUM_OF_MESSAGES) {
            startNewConsumer() // each consumer is a thread
        }
    }.start()


    synchronized(lock) {
        while (numOfFinishedConsumers < NUM_OF_MESSAGES) {
            try {
                (lock as java.lang.Object).wait()
            } catch (e: InterruptedException) {
                return@synchronized
            }
        }
    }

    synchronized(lock) {
        return Result(
                System.currentTimeMillis() - startTimestamp,
                numOfReceivedMessages …
Run Code Online (Sandbox Code Playgroud)

multithreading android kotlin kotlin-coroutines

3
推荐指数
1
解决办法
310
查看次数

使用 Dagger2 构建 AndroidStudio:java.lang.IllegalArgumentException: ... 不能表示为 Class&lt;?&gt;

当我尝试构建我的项目时,出现此错误(Gradle 使用--stacktrace命令行选项运行):

    * Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugJavaWithJavac'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:25)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:110)
    at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
    at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
    at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
    at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
    at org.gradle.initialization.DefaultGradleLauncher$4.run(DefaultGradleLauncher.java:154)
    at org.gradle.internal.Factories$1.create(Factories.java:22)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:52)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:151)
    at org.gradle.initialization.DefaultGradleLauncher.access$200(DefaultGradleLauncher.java:32)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:99)
    at org.gradle.initialization.DefaultGradleLauncher$1.create(DefaultGradleLauncher.java:93)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:62)
    at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:93)
    at …
Run Code Online (Sandbox Code Playgroud)

android illegalargumentexception android-gradle-plugin dagger-2

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

启动另一个全屏活动时未调用Activity的onStop()

我曾经认为,当活动A被另一个全屏活动B替换时,onStop()将调用A的回调.

这也反映在文档中:

活动的可见生命周期发生在对onStart()的调用和对onStop()的调用之间.在此期间,用户可以在屏幕上看到活动并与之交互.例如,当一个新活动开始并且这个活动不再可见时,会调用onStop().

在此输入图像描述

然而,现在,我正在观察不同的行为(在Lollipop和Marshmallow上测试).

我开始AuthenticationActivityHomeActivity和,尽管事实AuthenticationActivity是一个全屏幕活动,HomeActivity不停止.

在清单中声明这些活动:

    <activity
        android:name=".screens.home.activities.HomeActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity
        android:name=".screens.authentication.activities.AuthenticationActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:windowSoftInputMode="adjustResize"
        android:theme="@style/AppTheme.Transparent"/>
Run Code Online (Sandbox Code Playgroud)

当活动切换时,这是我在logcat中观察到的:

11-28 10:16:31.443 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.home.activities.HomeActivity@3561e8e1) paused
11-28 10:16:31.583 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.authentication.activities.AuthenticationActivity@2bbdb20f) created
11-28 10:16:31.753 15183-15183/somepackage D/Activity: performCreate Call secproduct feature valuefalse
11-28 10:16:31.753 15183-15183/somepackage D/Activity: performCreate Call debug elastic valuetrue
11-28 10:16:31.753 15183-15183/somepackage D/AuthenticationActivity: onStart()
11-28 10:16:31.753 15183-15183/somepackage I/LOG:: LifeCycle : …
Run Code Online (Sandbox Code Playgroud)

android activity-lifecycle android-activity

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

在 Kotlin 属性上使用 Dagger 的 @Provides 注释

当从 Dagger 的模块显式提供服务时,我可以使用以下语法:

@Provides
fun provideService(): MyService = MyService()
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用属性而不是函数,则不起作用:

@Provides
val myService get() = MyService()
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:This annotation is not applicable to target 'member property without backing field or delegate'

使用属性的方法感觉它应该起作用,但它没有。

我的问题是是否有办法使用属性从 Dagger 模块提供服务?

android kotlin dagger-2

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

找出添加提交的存储库

我们有两个git存储库,包含两个不同但非常相似的项目.

第一个项目是主项目(以下简称MAIN),第二个项目是MAIN(DERIV)的推导.

编辑:请注意,这些不是同一个回购中的不同分支,而是两个单独的回购.在每个回购中,我们只维护一个分支master.

我们并行处理这两个项目,但基本假设是对MAIN的每次更改也应该应用于DERIV.我们通过发布从MAIN到DERIV的定期拉动来满足这一要求.

问题:

  1. git log在DERIV中执行时,对于每次提交,我是否可以在添加了哪个存储库的克隆中看到?

    编辑:问题是,当两个repos维持一个分支时,这是否可行master.如果没有,那么问题就变成是否在两个repos中使用不同的分支名称将解决此问题.

  2. 我可以找到从MAIN到DERIV的拉动日期吗?

    编辑:问题git log如下:当我在MAIN项目上工作时,我从MAIN repo克隆到本地机器,做一些工作(多次提交),从MAIN拉出并解决冲突(如果有的话),推送到MAIN/master .最后一次提交的消息是Merge branch 'master' of MAIN.当我从MAIN拉到DERIV并解决冲突时,消息是Merge branch 'master' of MAIN- 与上面相同.我想在一个克隆中知道哪个repo是上面提到的(合并解析)提交.

  3. 我可以看到谁从MAIN到DERIV进行了拉动吗?
  4. 你认为从MAIN拉出是最好的方法吗?例如,樱桃采摘可以实现相同的结果(也许,可能是rebase).

谢谢

git

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

CoroutineExceptionHandler“吞掉”异常,但不调用handleException()函数

当我执行此单元测试时,我在输出中看到异常通知(可能是默认异常处理程序打印它):

@Test
fun uncaughtException() {
    runBlocking {
        val scope = CoroutineScope(Dispatchers.Default)
        val job = scope.launch() {
            delay(100)
            println("inside coroutine")
        }
        scope.launch {
            delay(50)
            throw Exception()
        }
        job.join()
    }
    Thread.sleep(100)
    println("test completed")
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试将自定义 CoroutineExceptionHandler 添加到范围的上下文中:

@Test
fun exceptionHandler() {
    runBlocking {
        val exceptionHandler = CoroutineExceptionHandler { _, throwable -> {
            println("Caught exception")
        }}
        val scope = CoroutineScope(Dispatchers.Default + exceptionHandler)
        val job = scope.launch() {
            delay(100)
            println("inside coroutine")
        }
        scope.launch {
            delay(50)
            throw Exception()
        }
        job.join()
    }
    Thread.sleep(100)
    println("test completed")
} …
Run Code Online (Sandbox Code Playgroud)

kotlin kotlin-coroutines

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