小编P_K*_*ing的帖子

服务运行时的应用程序类生命周期

我正在使用自定义Application类开发一个应用程序,它初始化了几个单例,以便它们在所有应用程序工作时间内生存.我的应用程序中还有一些与这些单例一起使用的服务.可能的情况是,应用程序类将被服务器之前的单例实例的Android销毁,因此服务将无法使用它们吗?或者应用程序总是为它的上下文服务而生活?找到解决这种情况的最佳方法是什么?

谢谢.

service lifecycle android

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

在根项目 buildscript 中使用复合构建中的 Gradle 插件

我使用 Gradle Kotlin DSL,在我的项目中我有单独的build-dependenciesgradle 模块,settings.gradle.kts如下所示:

pluginManagement {
    repositories {
        google()
        jcenter()
        gradlePluginPortal()
    }
}

includeBuild("build-dependencies")
Run Code Online (Sandbox Code Playgroud)

该模块包含空插件实现和Deps对象。其build.gradle.kts如下:

repositories {
    google()
    jcenter()
    gradlePluginPortal()
}

plugins {
    `kotlin-dsl`
    `java-gradle-plugin`
}

gradlePlugin {
  plugins.register("com.example.dependencies") {
      id = "com.example.dependencies"
      implementationClass = "com.example.dependencies.DependenciesPlugin"
  }
}
Run Code Online (Sandbox Code Playgroud)

部门对象:

object Deps {
  const val buildTools = "com.android.tools.build:gradle:4.1.1"
  // more dependencies
}
Run Code Online (Sandbox Code Playgroud)

我想Deps通过在文件中应用插件来在所有模块中使用这个对象build.gradle.kts

plugins {
  id("com.example.dependencies")
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,我可以导入和使用Deps对象。

但是当我想在根项目中使用它时build.gradle.kts,更准确地说在构建脚本中使用它时,会出现一个问题,如下所示:

buildscript {
    repositories {
        google() …
Run Code Online (Sandbox Code Playgroud)

android gradle gradle-plugin gradle-kotlin-dsl

11
推荐指数
0
解决办法
1007
查看次数

均衡器 - 未加载效果库

我几乎相同的问题,其中描述这里,答案在这个职位并不能帮助我,我立即释放我的乐队均衡水平设置之后.它在我的4.0.4设备上运行良好,它在朋友的2.3.5设备上运行良好,它在一小部分设备上崩溃,并且在这些设备上运行哪个版本的android无关紧要.

所以有错误

Equalizer mEqualizer = new Equalizer(0, mediaPlayer.getAudioSessionId());

java.lang.UnsupportedOperationException: Effect library not loaded
        at android.media.audiofx.AudioEffect.<init>(AudioEffect.java:355)
        at android.media.audiofx.Equalizer.<init>(Equalizer.java:149)
Run Code Online (Sandbox Code Playgroud)

我不知道如何解决这个问题,有什么建议吗?

android equalizer media-player

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

如果以RxJava Observable的形式提供,Kotlin密封类子类需要转换为基类

我试图在我用Kotlin编写的应用程序中避免RxJava链的终端状态,所以我发现转换Observable<T>到密封类的Observable<Result<T>>位置Result是正确的.

sealed class Result<T>
data class Success<T>(val data: T) : Result<T>()
data class Failure<T>(val throwable: Throwable) : Result<T>()
Run Code Online (Sandbox Code Playgroud)

让我们说我有这个网络请求是可观察的.

fun getOrganization(): Observable<Result<Boolean>> {
    return api.getOrganization("google")
            .map { Success(true) }
            .onErrorReturn { Failure(RuntimeException("throwable")) }
}
Run Code Online (Sandbox Code Playgroud)

所以我最终要做的就是处理这样的结果.

fun main(args: Array<String>) {
    getOrganization().subscribe({
        when (it) {
            is Success -> print("success = ${it.data}")
            is Failure -> print("failure = ${it.throwable}")
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

一切都应该工作得很好,但我在IDE中有这个错误.

错误

是不是只是简单地使用子类而不是基类?

我发现,如果我明确地投射Success(true)Result<Boolean>一切工作,但显示这个警告.

警告

它为什么会发生,我在这里做错了什么?

UPD. 看起来这里的主要问题是靠近rxjava的onErrorReturn运算符.如果我完全删除它,那么即使没有out像答案建议的关键字也能正常工作.

没有onErrorReturn

如果我Success从map和onErrorReturn 返回,那么 …

android kotlin rx-java

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

保存首选项

我是Android编程的初学者,不幸的是我遇到了问题:)

我在我的游戏中有方法writeSettings(),当我想通过readSettings()方法加载最后一个游戏时,我试图保存一些变量来使用它.有一些参数,如第一(第二)PlayerName,第一(第二)PlayerScore等.我正在尝试使用SharedPreferences来保存它们,但是在启动程序时我得到"强制关闭"对话框.

SharedPreferences preferences = getPreferences(MODE_PRIVATE); //Global variable

    private void writeSettings() {
                SharedPreferences.Editor editor = preferences.edit();
                editor.putInt("timeSave", time);
                editor.putString("firstPlayerNameSave", firstPlayerNameTextView.getText().toString());
                editor.putString("secondPlayerNameSave", secondPlayerNameTextView.getText().toString());
                editor.putString("firstPlayerScoreSave", firstPlayerScoreTextView.getText().toString());
                editor.putString("secondPlayerScoreSave", secondPlayerScoreTextView.getText().toString());
                editor.putInt("nowPlayerSave", nowPlayer);        
                editor.commit();

        }


       private void readSettings() {
    //"time" parameter program reads in another method
                    firstPlayerNameTextView.setText(preferences.getString("firstPlayerNameSave", ""));
                    secondPlayerNameTextView.setText(preferences.getString("secondPlayerNameSave", ""));
                    firstPlayerScoreTextView.setText(preferences.getString("firstPlayerScoreSave", ""));
                    secondPlayerScoreTextView.setText(preferences.getString("secondPlayerScoreSave", ""));
                    nowPlayer = preferences.getInt("nowPlayerSave", -1);

            }
Run Code Online (Sandbox Code Playgroud)

我怎么知道,问题出现在writeSettings()的第一个条目中.但我不知道我做错了什么?

对不起我的英语不好.

UPD.

12-23 16:23:31.334: ERROR/AndroidRuntime(410): Uncaught handler: thread main exiting due to uncaught exception
12-23 16:23:31.520: ERROR/AndroidRuntime(410): java.lang.RuntimeException: Unable …
Run Code Online (Sandbox Code Playgroud)

android

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

从/ res/raw获取文件

我需要你的帮助,可能这个问题对你来说很容易.我在/ res/raw文件夹中有一个文件.例如,它的id是R.raw.myFile.我需要获取"文件"对象.比如我可以用sdcard上的文件做

File file = new File("/sdcard/myFolder/myFile");
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

顺便说一句,如果有一些错误,请为我的英语道歉.

我需要"文件"对象.不流.

android

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

在键盘显示上忽略ScrollView填充

假设我有一个简单的布局:

https://imgur.com/k6zuh3f

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="80dp"
            android:clipToPadding="false">

        <LinearLayout
                android:id="@+id/container"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:padding="16dp">

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/ic_launcher" />

            ...


            <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="Eighth" />

        </LinearLayout>

    </ScrollView>

    <Button
            android:id="@+id/button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_margin="16dp"
            android:text="Button" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

请注意paddingBottomScrollView带有clipToPadding=false。它是必需的,因此Button看起来就像滚动视图内容上的浮动按钮。ScrollView填充用于在内容下方留出空间以使最后一个子项可用。

如果最后一个孩子是EditText我希望通过软件键盘ScrollView滚动EditText显示。但这以https://imgur.com/GwOtLIq结尾

使用layout_marginBottom代替可以实现某种预期的行为paddingBottom,但是在这种情况下,显然我看不到我的内容Button。截图https://imgur.com/oSC24qV

有没有一种方法ScrollView可以避免键盘方面的干扰?

更新:完整的xml代码在这里https://pastebin.com/P8n0aZ2i

android scrollview android-layout

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

Rx 运算符。忽略直到发出下一个

在我的应用程序中,我有一些耗时的逻辑,可以通过多种方式启动,比如自动或由用户手动启动。

// Let's describe different event sources as relays
val autoStarts = PublishRelay.create<Unit>()
val manualStarts = PublishRelay.create<Unit>()
val syncStarts = PublishRelay.create<Unit>()

// This is my time consuming operation.
fun longOperation() = Observable.interval(10, TimeUnit.SECONDS).take(1).map { Unit }

val startsDisposable = Observable
        .merge(
                autoStarts.flatMap { Observable.just(Unit).delay(30, TimeUnit.SECONDS) },
                manualStarts
        )
        .subscribe(syncStarts) // merge emissions of both sources into one

val syncDisposable = syncStarts
        .concatMap {
            longOperation()
        }
        .subscribe(autoStarts) // end of long operation trigger start of auto timer
Run Code Online (Sandbox Code Playgroud)

启动继电器会产生许多排放。假设用户单击按钮进行手动启动,距离定时器自动启动还剩 5 秒。longOperation() …

java android kotlin rx-java reactivex

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

MVI体系结构中的一次性事件

在演示者创建不可变状态(模型)流和视图的情况下,尝试使用新的体系结构范式进行渲染。

无法理解如何处理只需要一次进行某些事件的情况。有几个例子。

1)Notes应用。我们有editTextsaveButton。用户单击saveButton,将进行一些处理,并且应清除editText。你们能描述一下ViewState这里的内容以及大概的逻辑流程吗?

我现在看到的问题和陷阱:

  1. 我们editText.textChanges()在主持人中订阅。如果我们textViewState每个渲染调用中都包含并渲染它,那么我们将陷入递归,因为它将发出新的textChange并更新状态并再次渲染。
  2. 我们是否需要textViewState方向文本上还原它或取消/还原进程,看起来好像开箱即用。但是想象一下recyclerView滚动位置。我们绝对需要保存它才能还原。我们无法在每个渲染调用中恢复它,因为它看起来很奇怪,不是吗?
  3. 如果我们将这种逻辑视为副作用,并且将其称为.doOnNext{ view.clearText() }合理,那么我们在规范的MVI实现中是否有参考意见?Mosby没有它,如我所见。
  4. 这是有道理的,但有可能在doOnNext通话时视图消失。MVI应该为此提供帮助,但前提是它是的一部分ViewState,对吗?

2)Github应用。首先屏幕(组织)orgEditTextokButtonprogressBar。第二个屏幕(回购): recyclerView。当用户进入组织orgEditText并单击okButton应用程序时,应向API提出请求,并在成功时导航到“回购”屏幕,如果成功,则显示“祝酒”。再次请您描述ViewState一下组织屏幕,逻辑应该是什么样的?

我现在看到的问题和陷阱:

  1. 我们应该在加载时显示progressBar和禁用okButton。我们应该喜欢加载/内容/错误密封的类(我们称之为ContentState),并将其实例放在我们的中ViewState。View知道如何渲染ContentState.loading并显示progressBar和禁用okButton。我对吗?
  2. 那如何处理导航呢?与1.3和1.4相同的问题。
  3. 我已经看到了意见,导航应该被视为副作用,但还是1.4。
  4. 吐司-状态是否存在,还是我们认为这是副作用?同样的问题。

Google提出了SingleLiveEvent解决方案,但看起来很奇怪,然后应该有尽可能多的信息LiveData<SingleLiveEvent>流,而不是真正的真理来源。其他人则建议从render func生成新的意图,这种意图更好,但是有些异步操作可能会再次更改状态,因此我们会在第一次显示Toast时得到第二个Toast。

architecture android kotlin mosby

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

ExoPlayer getDuration

我正试图从url播放mp3文件ExoPlayer.

一切都很好,但现在我想知道什么时候getDuration()音轨是安全的.一旦加载了轨道,我就需要它.没有在谷歌的示例项目中找到它.

当我试着立即得到它之后,exoPlayer.prepare()我得到了UNKNOWN_TIME.

android exoplayer

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