小编Gak*_*ket的帖子

Gradle 4.0无法找到匹配的配置

我试图在新的Android Studio 3.0 canary 2中打开我现有的项目.我根据说明更新了Gradle ,更改了依赖配置的名称,但我继续得到下一个错误:

Unable to resolve dependency for ':app@productionRelease/compileClasspath': 
Could not resolve project : abChat.
Run Code Online (Sandbox Code Playgroud)

在另一个窗口:

Error:Could not resolve all dependencies for configuration ':bankOK:betaNewApiInnerTestRuntimeClasspath'.
> Unable to find a matching configuration in project :abChat:
    - Configuration 'debugApiElements':
        - Required apiLvl 'ProductFlavorAttr{name=newApi}' but no value provided.
        - Required com.android.build.gradle.internal.dependency.AndroidTypeAttr 'AndroidTypeAttr{name=Aar}' and found compatible value 'AndroidTypeAttr{name=Aar}'.
        - Required com.android.build.gradle.internal.dependency.BuildTypeAttr 'BuildTypeAttr{name=innerTest}' and found incompatible value 'BuildTypeAttr{name=debug}'.
        - Found com.android.build.gradle.internal.dependency.VariantAttr 'VariantAttr{name=debug}' but wasn't required.
        - Required org.gradle.api.attributes.Usage 'for runtime' …
Run Code Online (Sandbox Code Playgroud)

android gradle build.gradle android-gradle-plugin

49
推荐指数
5
解决办法
4万
查看次数

RxJava 2可取消和一次性有什么区别?

我想Observable使用RxJava 2 创建一个来自视图的单击侦听器.我从最简单的实现开始(我不在这里使用lambdas来向您展示此方法中的不同类型):

 Observable<View> viewObservable = Observable.create(new ObservableOnSubscribe<View>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<View> e) throws Exception {
            mNewWordView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View value) {
                    if (!e.isDisposed()) {
                        e.onNext(value);
                    }
                }
            });
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后我想到了onClickListener如果不需要进一步设置为null 的方法.我发现有两种类似(对我来说)名称的方法:

e.setCancellable(Cancellable c);e.setDisposable(Disposable d);

它们之间有什么区别,我应该使用哪种?

java android onclicklistener rx-java2

22
推荐指数
2
解决办法
6464
查看次数

Android:使用查找键管理联系人

我目前正在编写一个允许保存草稿的应用程序(使用android版本> = 2.0).每个草案都通过联系人与联系人联系ContactsContract.Contacts.LOOKUP_KEY.我的问题是,如果我更改联系人的姓名,查找键也会更改.这是这样的吗?

那么我需要一个查找键呢?我认为查找键永远不会改变,现在它无论如何都会改变.我对这种行为感到困惑......

有人可以向我解释如何永久链接到联系人吗?我应该使用ID而不是查找键吗?

提前致谢.

android android-contacts

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

使用WorkManager定期每日工作请求

如何正确使用WorkManagerAndroid Jetpack中的新功能来安排每天一次的定期工作,这应该每天做一次并且只做一次?

我们的想法是检查具有给定标签的工作是否已经存在WorkManager,否则开始新的定期工作.

我尝试使用下一种方法来做到这一点:

public static final String CALL_INFO_WORKER = "Call worker";

...

WorkManager workManager = WorkManager.getInstance();
List<WorkStatus> value = workManager.getStatusesByTag(CALL_INFO_WORKER).getValue();
if (value == null) {
    WorkRequest callDataRequest = new PeriodicWorkRequest.Builder(CallInfoWorker.class,
                24, TimeUnit.HOURS, 3, TimeUnit.HOURS)
                .addTag(CALL_INFO_WORKER)
                .build();
    workManager.enqueue(callDataRequest);
}
Run Code Online (Sandbox Code Playgroud)

value总是空,即使我把一个断点里面WorkerdoWork()方法(所以它肯定是正在进行中),并从另一个线程检查工作状态.

android android-architecture-components android-jetpack android-workmanager

10
推荐指数
2
解决办法
8472
查看次数

如何使RecyclerView在NestedScrollView中进行回收?

我试图将包括在内的几种观点RecyclerView纳入NestedScrollView。我曾经用过setNestedScrollingEnabled(false),它对于小型数据集看起来不错,但对于大型数据集却开始变得迟钝。

在花了一些时间记录该onCreateViewHolder()方法之后,我了解到回收者视图会像旧的一样立即创建它们ListView。我试图在RecyclerView文档中找到这种行为的原因,但是我在ScrollView description中找到了:

永远不要将ScrollView与ListView一起使用,因为ListView负责其自身的垂直滚动。最重要的是,这样做会挫败ListView中处理大型列表的所有重要优化,因为它有效地迫使ListView显示其整个项目列表,以填充ScrollView提供的无限容器。

我希望这NestedScrollView可以解决问题,但事实并非如此。

是否有任何方法,例如,使用一些自定义项LayoutManagerRecyclerView优化视图回收?

Ps当然,我知道getItemViewType(int pos)使用这种技术添加自定义页眉和页脚的方法和可能性,但是对我来说这似乎是一个丑陋的解决方法。是的,我目前正在使用它,因为拥有比这样大的性能问题更难维护的代码更好。

optimization android recycle android-scrollview android-recyclerview

6
推荐指数
0
解决办法
2020
查看次数

如何将服务内的 ExoPlayer 与活动内的 ExoPlayerView 连接起来?

我想将“全屏”按钮添加到 Google 的标准 SimpleExoPlayer 实现中。我添加了 ImageButton,到目前为止一切正常。

然后我决定全屏将以下一种方式工作:按下按钮后,我用全屏 SimpleExoPlayerView 打开新活动,传递视频 uri 和当前位置,初始化播放器并寻找给定位置。它有效,但播放器重新初始化需要 1-3 秒,具体取决于不想要的设备。

现在我想在意图服务中拥有一个播放器实例,只需将现有播放器重新附加到任何想要显示它的视图(预览或全屏视图),如下所示:

mPlayerView.setPlayer(mPlayer);
Run Code Online (Sandbox Code Playgroud)

问题是服务将拥有播放器,而活动将拥有视图。他们中的任何一个都不能同时连接播放器进行查看。作为一种解决方法,我考虑使服务类可能具有到播放器的静态链接,因此活动将能够通过静态引用获取它。但这似乎是一些代码异味,我不知道线程之间的通信是否会出现问题。

那么,我如何将播放器从服务(不是 Serializable 或 Parcelable)传递给 Activity 或者如何将播放器视图传递给服务?

android pass-by-reference exoplayer

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

库类(来自 Android sdk)取决于程序类(同样,Android sdk)

我们正在从 Android Gradle 插件 2.3.3 迁移到 Gradle 插件 3.0.1。我们的应用程序由应用程序模块和库模块组成。一些依赖项是可传递的(使用api关键字连接),但即使使用使它们成为非传递也implementation无济于事。将所有compile-type 依赖项更改为新依赖项后,调试构建运行良好。然而,使用 Proguard 的发布版本显示了数千个警告(在 2.3.3 上一切顺利)

特别是,我不明白为什么当库中的 Android 类依赖于程序中的 Android 类时我们会遇到这样的问题(这里只是几个例子):

Warning: library class android.app.ActionBar$LayoutParams extends or implements program class android.view.ViewGroup$MarginLayoutParams
Warning: library class android.app.ActivityManager$TaskDescription extends or implements program class android.os.Parcelable
Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams
Run Code Online (Sandbox Code Playgroud)

总体而言,以下类型的警告不会出现在 Gradle 插件 2.3.3 上(因此,Proguard 已配置):

Warning: there were 72 unresolved references to classes or interfaces.
         You may need to add missing library jars or update …
Run Code Online (Sandbox Code Playgroud)

android proguard gradle gradle-plugin android-proguard

5
推荐指数
2
解决办法
2345
查看次数

使用RxJava 2和Retrofit 2,适配器版本问题

我在Android Studio中为现有的应用程序模块添加了一个新的库模块.主要的区别是添加了RxJava 2和Retrofit 2.更新了new模块的build.gradle后,我开始得到下一个错误:

错误:任务':app:transformResourcesWithMergeJavaResForBetaNewApiDebug'的执行失败.com.android.build.api.transform.TransformException:com.android.builder.packaging.DuplicateFileException:在APK META-INF/rxjava.properties中复制的重复文件File1:C:\ Users\Gaket.gradle\_caches\modules-2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.2\cfccdd18cdfbe7b4773d42c9f3512eeafbe5cbf9\rxjava-2.0.2.jar File2:C:\ Users\Gaket.gradle\_caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.5\ece7b5d0870e66d8226dab6dcf47a2b12afff061\rxjava-1.1.5.jar

我看到RxJava存在一些问题(我想尝试RxJava 2,在这里我看到RxJava 1和RxJava 2).在添加所有依赖项后立即出现问题,我们不在RxJava主应用程序中使用.

更新: 正如我在下面提到的,我检查了三个主题(您可以在下面看到).这个问题:可能的重复类似于我在下面提到的那个: 这一个.他们两个都有解决方法,没有考虑我在答案中强调的真正问题.而答案是 "没有的生产就绪适配器从改造2至RxJava 2的时刻"(以下答案中描述的全部细节).

我检查了几个主题:首先 是一个具体问题的具体解决方案,第二个谈论rxbindings,但我不使用它们,其他一些也没有解决我的问题或看起来像这个完全解决方法.我试图谷歌"rxjava 2和改造2"但没有找到解决方案.

这是build.gradle图书馆:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

android {
compileSdkVersion 25
buildToolsVersion "25.0.0"

defaultConfig {
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}



dependencies {
compile fileTree(dir: 'libs', include: …
Run Code Online (Sandbox Code Playgroud)

android retrofit2 gradle-dependencies rx-java2

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

RecyclerView notifyDataSetChanged() 在没有 ANR 的情况下冻结 UI

我们有一个 NestedScrollView,它包含两个不同的RecyclerView垂直滚动。滚动布局位于SwipeRefreshLayout.

更新:我们知道getItemViewType(pos)方法并在其他地方使用它。但是这里我们有复杂的逻辑,将进一步分为 2 个不同的屏幕,因此我们为每个 RecyclerView 设置了两个单独的演示器,将它们合并为一个并在一个月内再次分离不是一种选择。

从某个时候,我们注意到使用滑动刷新更新屏幕开始冻结 UI:日志中的跳帧、无法使用 UI 进行任何操作、冻结进度条。最多需要五秒钟,但我们没有收到 ANR。它在开始时运行良好,在结束时冻结。如果我们notifyDataSetChanged()在适配器中移除,一切看起来都不错。

我们试图删除回收站视图之一,从ViewHolder.onCreate()和 中删除所有操作,onBindViewHolder()但没有帮助。此外,我们交叉检查了问题是否来自某些数据处理(我们使用 RxJava 2 来操作线程),我们看到所有与网络、数据库和数据处理相关的操作都是在非 UI 线程中进行的,并且目前已经完成当滞后开始时。

这是布局:

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/swipe_refresh"
    android:layout_width="match_parent"
    android:layout_height=«match_parent"
    android:orientation="vertical"
    >
<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content»
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation=«vertical"
        android:paddingBottom="@dimen/spacing_bigger»>
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycle_chats"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white_bg"
            />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycle_friends"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/white_bg"
            />

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
Run Code Online (Sandbox Code Playgroud)

android android-anr-dialog android-recyclerview android-nestedscrollview

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

通知通道的重要性会被单个通知的重要性所取代吗?

问题是针对Android O及更高版本。

例如,我创建了一个名为“ default”的通知通道并进行设置IMPORTANCE_DEFAULT。然后,我创建了一个通知,将其添加到频道并放入IMPORTANCE_HIGH其构建器中。通知的最终优先级是什么?

我在文档中找不到答案,他们说要支持较早的版本,需要单独的答案:

为了支持运行Android 7.1(API级别25)或更低版本的设备,您还必须使用NotificationCompat类中的优先级常量为每个通知调用setPriority()。

https://developer.android.com/training/notify-user/channels#importance

notifications android android-support-library

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