小编Boo*_*per的帖子

改造2.0 + RxJava +错误JSON正文

我是RxJava和Retrofit的新手,我正在尝试用它编写API调用.所有API调用都返回错误的JSON主体,其格式为,

{"errors":[{"code":100, "message":"Login/Password not valid", "arguments":null}]}
Run Code Online (Sandbox Code Playgroud)

目前我的登录API调用代码(其他也类似)是,

mConnect.login(id, password)
        .subscribe(new Subscriber<Token>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "onCompleted()");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError(): " + e);
                if (e instanceof HttpException) {
                  // dump e.response().errorBody()
                }
            }

            @Override
            public void onNext(Token token) {
                Log.d(TAG, "onNext(): " + token);
            }
        });
Run Code Online (Sandbox Code Playgroud)

当我在onError()上收到错误时,我想自动将错误体中的JSON解码为POJO并使用它.有没有办法在一个地方为所有其他API调用执行此操作.任何帮助表示赞赏.

android json rx-java retrofit

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

通过SSH隧道访问Git repo

我可以访问可以访问GIT服务器的SSH帐户,并且能够在此SSH登录中克隆/推送/拉取存储库.但是,我无法从其他地方访问此回购.

在我使用的SSH帐户上,

git clone git@gitserver:proj/myrepo.git
Run Code Online (Sandbox Code Playgroud)

克隆回购.

我尝试使用其他机器设置到git服务器的ssh隧道,

ssh -L 3333:gitserver:22 userid@sshserver
git clone ssh://localhost:3333/proj/repo.git
Run Code Online (Sandbox Code Playgroud)

但是我不断收到用户'git'的密码提示.我在这里做错了什么想法?

git ssh ssh-tunnel

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

为什么这是内存泄漏

我在Android(Java)中遇到了一个名为LeakCanary的内存泄漏检测库,但无法理解他们泄漏内存的示例.任何人都可以解释他们的示例中显示的代码是如何以及为什么是内存泄漏.

class Cat {
}
class Box {
  Cat hiddenCat;
}
class Docker {
  static Box container;
}

// ...

Box box = new Box();
Cat schrodingerCat = new Cat();
box.hiddenCat = schrodingerCat;
Docker.container = box;
Run Code Online (Sandbox Code Playgroud)

然后他们观察schrodingerCat泄漏的变量,如下所示给出泄漏(我不知道如何与上面的代码相关).

* GC ROOT static Docker.container
* references Box.hiddenCat
* leaks Cat instance
Run Code Online (Sandbox Code Playgroud)

任何有关泄漏的解释以及检测与其相关的帮助都将非常有帮助.另外一些适合初学者的好文章也不错.

谢谢!

android memory-leaks leakcanary

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

Google登录使用新的GoogleSignInOptions获取访问令牌

我的Android应用程序当前使用GoogleAuthUtil来登录用户并获取access_token传递给后端的代码段(下面的代码片段显示创建GoogleApiClient并使用GoogleAuthUtil获取令牌).

mGoogleApiClient = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .addOnConnectionFailedListener(this)
        .addApi(Plus.API)
        .addScope(new Scope("profile"))
        .build();
...
...

String accessToken = GoogleAuthUtil.getToken(GoogleLoginActivity.this,
                            Plus.AccountApi.getAccountName(mGoogleApiClient),
                            "oauth2:profile email");
Run Code Online (Sandbox Code Playgroud)

然后我发送到后端

我现在正在尝试迁移到新的Google SignIn - https://developers.google.com/identity/sign-in/android/sign-in

所以改变了GoogleApiClient的创作,比如

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestEmail()
        .requestIdToken("<web client id>")
        .build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
        .enableAutoManage(this, this)
        .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
        .build();
Run Code Online (Sandbox Code Playgroud)

然后进行登录使用,

startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN);
Run Code Online (Sandbox Code Playgroud)

和活动结果使用(类似于上面链接中的示例),

OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
if (opr.isDone()) {
    // If the user's cached credentials are valid, the OptionalPendingResult will be "done"
    // and the GoogleSignInResult will be available instantly.
    Log.d(TAG, …
Run Code Online (Sandbox Code Playgroud)

android google-login oauth-2.0 google-play-services google-oauth2

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

浓咖啡动态微调试验

我正在尝试测试动态生成的Spinner.我能够点击微调器然后我需要从列表中选择一个显示给定文本的选项(我从hierarchyviewer中发现PopupWindow显示但是无法获得所需的文本,这是在屏幕外) .微调器使用自定义对象的ArrayAdapter(下面的代码),

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Spinner mySpinner = (Spinner) findViewById(R.id.my_spinner);
        List<MyValue> list = Arrays.asList(
                new MyValue("One", "1"),
                new MyValue("Two", "2"),
                new MyValue("Three", "3"),
                new MyValue("Four", "4"),
                new MyValue("Five", "5"),
                new MyValue("Six", "6"),
                new MyValue("Seven", "7"),
                new MyValue("Eight", "8"),
                new MyValue("Nine", "9"),
                new MyValue("Ten", "10"),
                new MyValue("Eleven", "11"),
                new MyValue("Twelve", "12"),
                new MyValue("Thirteen", "13"),
                new MyValue("Fourteen", "14"),
                new MyValue("Fifteen", "15"),
                new MyValue("Sixteen", "16"),
                new MyValue("Seventeen", "17"),
                new MyValue("Eighteen", …
Run Code Online (Sandbox Code Playgroud)

android automated-tests ui-testing android-spinner android-espresso

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

RxJava2过滤器列表<Object>

我正在尝试使用RxJava2过滤List,这样列表中的每个项目(对象)都应该通过验证检查,我得到的结果列表只包含通过该测试的项目.例如,如果我的Object具有以下结构,

class MyClassA {
    int value1;
    int value2;
}
Run Code Online (Sandbox Code Playgroud)

我想只获取value210 的项目列表.

我有一个API调用函数,它返回一个Observable of List,即Observable<List<MyClassA>>如下,

apiService.getListObservable()
    .subscribeOn(Schedulers.io)
    .observeOn(AndroidSchedulers.mainThread());
Run Code Online (Sandbox Code Playgroud)

我希望对输出进行过滤,所以我尝试.filter()在上面添加一个运算符,但它似乎需要一个Predicate<List<MyClassA>>而不仅仅是一个MyClassA我可以检查的对象,并且只允许其中的一个value2 == 10.

我对RxJava和RxJava2很新,看起来我在这里缺少一些基本的东西?

TIA

java rx-java rx-android rx-java2

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

链中的 RxJava 多个 subscribeOn()

我想知道当我们subscribeOn()在 RxJava 链中有多个方法时会发生什么。例如,如果我有一个像这样的链条,

    Single.fromCallable { repository.apiCall1() }
        .subscribeOn(Schedulers.io())
        .flatMap { result -> Single.fromCallable { repository.apiCall2() } }
        .subscribeOn(Schedulers.io())
        .map { // do something }
        .observeOn(Schedulers.ui())
Run Code Online (Sandbox Code Playgroud)

这是否意味着 API 调用运行的线程不一样?删除subscribeOn(Schedulers.io())上面这个链中的第一个调用会产生什么影响?

感谢您对此的任何见解

android rx-java rx-java2

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

使用spongycastle LICENSE.class的java.util.zip.ZipException

我试图包括两个不同的第三方库,两者似乎都包括不同版本的Spongy城堡.两者都包含在我的build.gradle中的编译语句中,一个包含在AAR(@aar)中,而另一个包含在正常情况下.

当我尝试用这两个libs编译调试buildType时(sync不显示问题).我看到以下内容,

错误:任务':app:transformClassesWithJarMergingForDebug'的执行失败.

com.android.build.api.transform.TransformException:java.util.zip.ZipException:重复条目:org/spongycastle/LICENSE.class

一直在寻找如何解决这个问题,同时保留两个库(两者都需要),但一直无法找到方法.任何来自高级Android开发人员或gradle专家的帮助将不胜感激.

谢谢!

[的build.gradle]

apply plugin: 'com.android.application'

repositories {
    maven { url 'http://mobile-sdk.jumio.com' }
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    packagingOptions {
        pickFirst 'org/spongycastle/x509/CertPathReviewerMessages.properties'
        pickFirst 'org/spongycastle/x509/CertPathReviewerMessages_de.properties'
    }

    defaultConfig {
        applicationId "com.example.me.license"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.3.0'

    compile "com.jumio.android:jumio-mobile-sdk:1.9.0@aar"
    compile 'com.worldpay:cse-android-sdk:1.0.2'
}
Run Code Online (Sandbox Code Playgroud)

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

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

仅在 CoordinatorLayout 中的滚动时显示工具栏阴影

我想知道如何在 CoordinatorLayout 中使用 Toolbar / CollapsingToolbarLayout 仅当内容在其下方滚动时才显示阴影,否则不显示阴影(即创建片段后,在用户开始向下滚动之前,它不应显示阴影)列表)。最好只使用 XML

(我认为这里不需要 AppBarLayout,因为工具栏的大小是固定的,不需要调整大小或视差效果等。)

非常感谢任何帮助

android android-toolbar android-collapsingtoolbarlayout

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

Kotlin 中带有详尽 `when` 块的 NoWhenBranchMatchedException

我在 Kotlin 有以下密封类

sealed class Result<T, E> {
    class Success<T, E>(val result: T) : Result<T, E>()
    class Failure<T, E>(val failure: E) : Result<T, E>()
}
Run Code Online (Sandbox Code Playgroud)

create()并从函数返回 Result 实体

并将以下内容与 RxJava2 一起使用,

    return Single.fromCallable { repository.create(details) }
            .map {
                return@map when(result) {
                        is Result.Success -> CreatedState.Success(result.result)
                        is Result.Failure -> CreatedState.Error(result.failure)
                }
            }
Run Code Online (Sandbox Code Playgroud)

据我所知,该功能似乎按预期工作。然而当我对此进行单元测试时,

    val testSubscriber = underTest.create(newDetails).test()
Run Code Online (Sandbox Code Playgroud)

我得到一个并在异常列表中java.lang.IllegalStateException看到一个(当执行一个时),我无法理解它是如何发生的,因为我的何时检查是详尽的。或者我在那里错过了什么?kotlin.NoWhenBranchMatchedExceptionassertComplete()

蒂亚!

android kotlin rx-java2

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

如何在 Android 上对 RxJava Completable.error 进行单元测试

我有一个返回 Completable 的函数,Completable.error(RuntimeException("message"))如果另一个函数失败或Completable.complete()失败,则该函数返回。

我试图为此编写一个单元测试,并查看流程正确地转到错误和成功代码,但在我的测试中,我无法使用区分它们

underTest.unregisterFromService().test().assertComplete().assertNoErrors()

有谁知道如何Completable.error()在单元测试中检查该值?

android rx-java rx-java2

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