小编Bel*_*loo的帖子

Gradle错误:只允许在android studio中从事件调度线程进行写访问

在将Android Studio更新到2.2版(在Windows 10上)之后,第二天早上我在任何项目上构建了gradle时收到了这样的错误:

__PRE__

尽管gradlew -build命令已成功运行并完成.我尝试了WTF修复集的典型android开发:清理构建,无效缓存,删除构建文件夹,删除.gradle文件夹,尝试不同的gradle设置,甚至重新安装android工作室,没有任何帮助.

我创建这个问题只是为了与社区分享我的经验,因为我浪费了两个小时.

android gradle gradlew android-studio android-gradle-plugin

118
推荐指数
2
解决办法
6万
查看次数

确定LayoutManager预布局中的显示视图

当项目从可见屏幕边界外移动到可见点时,我想支持自定义LayoutManager中的预测动画.

我做的所有灌装操作onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state).

根据支持预先布局阶段(state.isPreLayout())的预测动画的文档,我应该设置更改动画的初始条件(例如,在某处放置出现的视图)

问题是我无法找到一种方法来确定预先布局哪些视图将从外部移动,因为我只能使用附加到RecyclerView视图的当前操作,并且预布局阶段之后onItemsMoved(RecyclerView recyclerView, int from, int to, int itemCount)调用方法.(例如预布局之前调用onItemsRemoved )

它是错误的,LayoutManager或者我可以在预先布局中以某种方式确定哪些视图将很快被移动?

PS:我能够保持从可见点到外部的预测动画,因为我能够遍历可见视图并确定recycler.convertPreLayoutPositionToPostLayout将要移动哪些视图.

//childViews is an iterable over RecyclerView items
for (View view : childViews) {
    RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) view.getLayoutParams();

    boolean probablyMovedFromScreen = false;

    if (!lp.isItemRemoved()) {
        //view won't be removed, but maybe it is moved offscreen
        int pos = lp.getViewLayoutPosition();

        //start view is a first …
Run Code Online (Sandbox Code Playgroud)

java android android-animation android-layout android-recyclerview

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

换行,KDoc的新行

假设我们有这样的文件字符串

/** retrieve a state of the service
* <br/> HTTP code 200 - normal state
* <br/> HTTP code 403 - some recoverable state:
const val SERVICE_STATE = "servicestate" */
Run Code Online (Sandbox Code Playgroud)

这里有几个<br/>,我用来打破一条线,就像我在java中做的那样,但AndroidStudio的输出(在InteliJIdea中看起来相同)是 在此输入图像描述

使用java,它被正确解析和显示:

/** retrieve a state of the service
 * <br/> HTTP code 200 - normal state
 * <br/> HTTP code 403 - some recoverable state */
public static final String SERVICE_STATE = "servicestate";
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我能以某种方式与kotlin和IntelijIdea达到同样的目的,也许kotlin可以在KDoc中打破这条线吗?

intellij-idea kotlin android-studio kdoc

9
推荐指数
2
解决办法
1390
查看次数

@StringRes,@ DrawRes,@ LayoutRes等android注解lint检查与kotlin参数

假设您有这样的具有默认参数的数据类

data class Info(
        @DrawableRes
        val iconRes: Int = 0,
        @StringRes
        val stringRes: Int = 0,
        @LayoutRes
        val layoutRes: Int = 0)
Run Code Online (Sandbox Code Playgroud)

所以你可以创建这样的数据类

    val data = Info(
        iconRes = R.drawable.icon, 
        stringRes = R.string.text,
        layoutRes = R.layout.layout)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有任何lint错误

但是,当我尝试使用默认参数时,会发生lint错误:

val data = Info(
        //here is expected resource of type drawable error
        stringRes = R.string.text
        layoutRes = R.layout.layout)
Run Code Online (Sandbox Code Playgroud)

似乎它在参数中使用位置,而不是确切的类型和名称.

我试过使用类似的显式注释@param:DrawableRes,但结果相同.

我可以以某种方式解决这个问题吗?我使用最新的Android Studio 3.0.

android kotlin

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

Gradle - DexException:多个dex文件定义

我知道这个问题已经被问到了,但我找不到合适的答案来解决我的问题.我希望你们能帮助我.

例外情况告诉Multiple dex files defined我,我尝试了几种常见的方法来解决这个问题.不幸的是,这没有帮助.

* What went wrong:
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2



Cause: com.android.dex.DexException: Multiple dex files define Lnet/jcip/annotations/GuardedBy;
        UNEXPECTED TOP-LEVEL EXCEPTION:
        com.android.dex.DexException: Multiple dex files define Lnet/jcip/annotations/GuardedBy;
            at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
            at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
            at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
            at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
            at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
            at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
            at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
            at com.android.dx.command.dexer.Main.run(Main.java:277)
            at com.android.dx.command.dexer.Main.main(Main.java:245)
            at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)
  1. 我试图清理并重建项目.

    • 建立 - >清洁项目
    • 构建 - >重建项目
  2. 然后我尝试使高速缓存无效并重新启动.

    • 文件 - >使高速缓存无效并重新启动
  3. 我还运行此命令以了解依赖项中的重复:

    ./gradlew -q dependencies …

android gradle dex android-studio android-gradle-plugin

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

自定义RecyclerView的LayoutManager。删除项目的动画结束后的自动测量

我创建了一个自定义布局管理RecyclerView。我已通过启用了我的经理的构造函数中的自动测量setAutoMeasureEnabled(true)

RecyclerViewlayout_height设置为wrap_content与此属性LayoutManager是能够测量的高度RecyclerView,根据里面的物品。它工作正常,但是当我删除底部的最后一个项目时,正在播放删除的动画,这会RecyclerView导致在动画结束之前测量其高度到结果高度。

看这个gif。 在此处输入图片说明 绿色背景是RecyclerView的地方

您可能已经猜到,此行为对于添加项目是正确的,因为在这种情况下,应在动画之前测量容器

RecyclerView动画结束后如何处理这种情况以使处理自动测量?我有所有孩子定位逻辑,onLayoutChildren但是我认为发布此问题不是必需的,它可能是如此广泛和不清楚。

可能我应该onMeasure手动处理layoutManager的拦截器(删除项目后调用4次(在onItemsRemoved调用之前进行一次))。因此,我可以根据删除开始时收到的高度在此处设置测量的高度:

@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) {
    super.onMeasure(recycler, state, widthSpec, heightSpec);
    requestSimpleAnimationsInNextLayout();
    if (!isAutoMeasureEnabled()) {
        setMeasuredDimension(getWidth(), preHeight);
    }
}

@Override
public void onItemsRemoved(RecyclerView recyclerView, int positionStart, int itemCount) {
    super.onItemsRemoved(recyclerView, positionStart, itemCount);
    setAutoMeasureEnabled(false);

    new Handler(Looper.myLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            setAutoMeasureEnabled(true);
            requestSimpleAnimationsInNextLayout();
            requestLayout();
        } …
Run Code Online (Sandbox Code Playgroud)

animation android android-layout android-recyclerview

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

使用内联函数创建匿名对象。它是否包含封闭类的泄漏?

如您所知,java 中的每个匿名对象都包含对封闭类的隐藏引用。
但有了 kotling,事情就变得更加复杂了。

Lambda 是匿名类的另一种表示形式,但在 kotlin 中它的编译并不简单,因为如果 lambda 没有显式捕获封闭类的引用,那么它会像嵌套那样编译,而不是内部类(匿名类),并且不会泄漏。

但是内联函数呢?考虑下面的代码

class A {
    fun test(){
        val it = withReference {
            //todo make sth
        }
    }

}

inline fun withReference(crossinline action: () -> Unit) = object: Reference {
    override fun method1() {
        action()
    }
    override fun method2() {
    }
}

interface Reference {
    fun method1()
    fun method2()
}
Run Code Online (Sandbox Code Playgroud)

据我所知,内联函数会像非包装代码一样编译到 A 类,所以问题是开放的。

匿名是否object: Reference包含指向封闭类的链接A,这可能导致内存泄漏?

PS:我已阅读this article,但它不包含我的情况的答案

memory-leaks kotlin

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

片段添加动画播放时禁用点击

我有一个方法,执行片段添加动画和新片段填充所有屏幕:

public void addFragmentWithAnimation(Fragment fragment, boolean addToBackStack){
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right, R.anim.slide_in_left, R.anim.slide_out_right);
    if (addToBackStack) {
        transaction.addToBackStack(null);
    }
    transaction.add(R.id.lay_fragments, fragment);
    commitTransaction(transaction);
}
Run Code Online (Sandbox Code Playgroud)

但是当动画播放用户仍然允许点击下面视图上的按钮并进行另一个ui操作时,这可能会导致不可预测的结果.有没有办法阻止应用程序中的所有用户操作,直到动画结束?

user-interface animation android onclick android-fragments

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

Android Retrofit2 可选 @Path 参数

在我的 andorid 应用程序中,我使用 Retrofit2 发出 GET 请求:

http://myapi.com/items/list
Run Code Online (Sandbox Code Playgroud)

但我还想提出另一个要求,例如

http://myapi.com/items/list/filter/active:true,min_price:100
Run Code Online (Sandbox Code Playgroud)

所以过滤器参数是可选的。我正在尝试执行以下操作:

@GET("items/items/list{filter}")
Observable<ResponseItems> getItems(@Path("filter") String filter);
Run Code Online (Sandbox Code Playgroud)

并称之为:

service.getItems("")
Run Code Online (Sandbox Code Playgroud)

和:

service.getItems("/filter/active:true,min_price:100")
Run Code Online (Sandbox Code Playgroud)

但它不起作用。所以我最终创建了两个单独的服务调用,一个带有过滤器参数,另一个没有。我认为应该有更优雅的方法。

android retrofit2

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

在单元测试中处理 protobuf 类时出现 NoSuchMethod 错误

我正在尝试使用 protobuf 模型编写类的单元测试并在 Android Studio 中运行它们。
例如,这是一个简单的转换器测试

class UpdateConfigConverterTest {

    private val testable = UpdateConfigConverter()

    @Test
    fun `should convert from proto model`() {
        val url = "https://test.com"
        val availableVersion = 1
        val requiredVersion = 0
        val result = testable.convert(
            ProtoUpdateConfig.newBuilder()
                .setAvailable(availableVersion)
                .setRequired(requiredVersion)
                .setUrl("https://test.com")
                .build()
        )
        assertEquals(availableVersion, result.updateAvailableVersion)
        assertEquals(requiredVersion, result.updateRequiredVersion)
        assertEquals(url, result.url)
    }
}
Run Code Online (Sandbox Code Playgroud)

被测类:

internal typealias ProtoUpdateConfig = UpdateConfig
internal class UpdateConfigConverter {

    fun convert(source: ProtoUpdateConfig): UpdateConfig =
        UpdateConfig(
            updateAvailableVersion = source.available,
            updateRequiredVersion = source.required,
            url = source.url
        )
} …
Run Code Online (Sandbox Code Playgroud)

junit protocol-buffers kotlin android-studio protobuf-java

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

始终使用dagger 2初始化依赖关系,无需任何注入或提供

假设你有这样的课程:

@SomeScope
class ServiceScopeManager {

    @Inject
    Dependency1 dependency1;
    @Inject
    Dependency2 dependency2;

    @Inject
    ServiceScopeManager(){
    }

    @Inject
    void init(){
        //do something really important with dependencies
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 此类不会注入任何其他类
  • 该类未提供给@Provides模块中的任何方法

正如您所看到的那样,它是高级类,例如,它可以侦听系统中的某些事件并执行其依赖项的释放.

问题是这个类不会被创建,因为没有任何东西依赖它.
我能以某种方式告诉匕首始终创建依赖于组件创建(例如),而不是默认需要时吗?或者可能以任何其他方式达到要求.

java android dagger-2

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