小编Ros*_*hak的帖子

杰克逊将字符串字段解析为JSON

我有以下JSON:

{
    "some_key": "{\"a\": 1, \"b\": \"text\"}"
}
Run Code Online (Sandbox Code Playgroud)

如您所见,some_keyfield不是JSON对象,它是一个包含有效JSON的字符串.

我想将其解析为以下结构:

class Foo {
    Bar some_key;
}

class Bar {
    int a;
    String b;
}
Run Code Online (Sandbox Code Playgroud)

更新:

  • A和B类,有getter和setter,构造函数.我没有展示它们以保持样品简短.

  • 我无法编辑JSON的奇怪结构.

  • 问题是如何让Jackson将内部字符串字段解析为JSON对象.

java jackson

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

如果第二个立即失败,ReactiveX concat不会从第一个observable产生onNext

我连续两个observable来显示缓存中的数据,然后开始从网络加载数据并显示更新的数据.

Observable.concat(
    getContentFromCache.subscribeOn(dbScheduler),
    getContentFromNetwork.subscibeOn(networkScheduler)
).observeOn(AndroidSchedulers.mainThread())
 .subscribe(subscriber);
Run Code Online (Sandbox Code Playgroud)

如果没有网络连接,则在调用OnSubscribe后第二个observable会立即失败.

如果第二个observable立即失败,则第一个observable的数据将丢失.永远不会在订阅者中调用onNext方法.

我想,这可能是由于OperatorConcat.ConcatSubscriber中的以下代码造成的

    @Override
    public void onNext(Observable<? extends T> t) {
        queue.add(nl.next(t));
        if (WIP_UPDATER.getAndIncrement(this) == 0) {
            subscribeNext();
        }
    }

    @Override
    public void onError(Throwable e) {
        child.onError(e);
        unsubscribe();
    }
Run Code Online (Sandbox Code Playgroud)

看起来在收到错误后它取消订阅,并且所有挂起的onNext都将丢失.

解决问题的最佳方法是什么?

更新

看起来我找到了解决方案,而不是为连接的observable设置observOn我为每个observable设置了observOn.

Observable.concat(
    getContentFromCache.subscribeOn(dbScheduler).observeOn(AndroidSchedulers.mainThread()),
    getContentFromNetwork.subscibeOn(networkScheduler).observeOn(AndroidSchedulers.mainThread())
)
 .subscribe(subscriber);
Run Code Online (Sandbox Code Playgroud)

rx-java

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

Dagger @ContributesAndroidInjector ComponentProcessor无法处理此接口

我正在测试匕首的新功能:Android模块.我使用时无法编译代码@ContributesAndroidInjector 我总是遇到以下错误:

错误:(12,8)错误:dagger.internal.codegen.ComponentProcessor无法处理此接口,因为并非所有依赖项都可以解析.使用生成的代码检查编译错误或循环依赖性.

我试着像这里实现我的组件,但我仍然得到了错误.

这是最小的例子:

@PerApplication
@Component(modules = {AndroidInjectionModule.class, LoginBindingModule.class})
public interface ApplicationComponent {
    void inject(ExampleApplication application);
}

@Module
public abstract class LoginBindingModule {
    @ContributesAndroidInjector
    abstract LoginActivity contributeYourActivityInjector();
}

public class LoginActivity extends Activity {

    @Inject
    LoginPresenter loginPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
    }
}

public class LoginPresenter {

    @Inject
    public LoginPresenter() {

    }
}
Run Code Online (Sandbox Code Playgroud)

如果我从ApplicationComponent中删除LoginBindingModule,那么app将被构建,但是会因运行时异常而失败:

java.lang.IllegalArgumentException:没有为Class绑定的进程工厂

项目设置:

gradle 3.3
buildToolsVersion "25.0.2"
dagger 2.11
Run Code Online (Sandbox Code Playgroud)

android dependency-injection dagger-2

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

如何在主线程上使用Kotlin协同程序await()

我刚刚开始学习Kotlin协同程序,并试图模拟一些长时间的API调用,并在UI上显示结果:

class MainActivity : AppCompatActivity() {
    fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")

    override
    fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        this.setContentView(R.layout.activity_main)
        val resultTV = findViewById(R.id.text) as TextView

        val a = async(CommonPool) {
            delay(1_000L)
            6
        }

        val b = async(CommonPool) {
            delay(1_000L)
            7
        }

        launch(< NEED UI thread here >) {
            val aVal = a.await()
            val bVal = b.await()
            resultTV.setText((aVal * bVal).toString())
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白我怎么可能launchmain上下文中使用方法.

不幸的是,我无法找到任何关于为协同程序的官方教程提供某些特定线程的结果的信息.

android kotlin kotlin-coroutines

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

rxJava2在复杂流中组合Single,Maybe,Completable

我很高兴能与新RxJava Sources如:Single,Maybe,Completable,,使您接口的类的"源"的创建过程更清洁,防止了很多错误(如忘记调用onComplete())

但它需要大量的样板才能将它们组合成一个复杂的流.

例如,我们有加载和缓存数据的常见Android情况.假设我们有2个来源api,并cache和我们想将其结合:

public interface Api {
    Single<Integer> loadFromNetwork();
}

public interface Cache {
    Maybe<Integer> loadFromCache(); //maybe because cache might not have item.
}
Run Code Online (Sandbox Code Playgroud)

让我们试着把它结合起来:

final Single<Integer> result = cache.loadFromCache()
        .switchIfEmpty(api.loadFromNetwork());
Run Code Online (Sandbox Code Playgroud)

它不会编译,因为Maybe没有重载Maybe.switchIfEmpty(Single):Single

所以我们必须转换一切:

final Single<Integer> result = cache.loadFromCache()
        .switchIfEmpty(api.loadFromNetwork().toMaybe())
        .toSingle();
Run Code Online (Sandbox Code Playgroud)

组合它的另一种可能方法还需要сonversion:

final Single<Integer> result = Observable.concat(
            cache.loadFromCache().toObservable(),
            api.loadFromNetwork().toObservable()
        ).firstOrError();
Run Code Online (Sandbox Code Playgroud)

因此,我没有看到任何使用新源的方法,没有很多转换会增加代码噪声并创建大量额外的对象.

由于这样的问题,我不能使用Single,Maybe,Completable和继续使用Observable无处不在.

所以我的问题是:

  • 什么是相结合的最佳实践Single, …

java android rx-java rx-java2

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

存储访问框架持久权限不起作用

我使用Android Storage Access Framework访问SD卡上的一些文件.对我来说,保持此权限非常重要,能够在重启设备后编辑文件.

因此,根据Storage Access Framework文档,我使用Persist权限,即使设备已重新启动,也可以通过您的应用程序继续访问文件.

但是,经过一段时间后,我注意到对于某些用户,权限以某种方式被撤销.因为当我尝试使用SAF进行编写时,我得到android.system.ErrnoException: open failed: EACCES (Permission denied) 了该异常之后我会检查我使用了哪些权限,mContext.getContentResolver().getPersistedUriPermissions()但它返回空列表.我确信用户为我提供了正确的权限,并且权限是针对当前安装的Sd卡,因为我在数据库中跟踪此操作.

目前,在这种情况下,我正在显示文档选择器,因此用户可以再次为我提供新的权限,但要求用户执行相同的操作通常不是用户友好的.

什么可以导致撤销权限?我怎么能防止这种撤销?

我已经在我的所有设备上测试了多次手机重启,更换时间,删除插入SD卡,但无法丢失任何安全权限.

我有下一个获取权限的代码:

private void openDocumentTree() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        startActivityForResult(intent, REQUEST_CODE);
    }

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CODE) {
            Uri treeUri = data.getData();
            final int takeFlags = data.getFlags() & ( 
                    Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            mContext.getContentResolver().takePersistableUriPermission(treeUri,
                    takeFlags);

                    //this is my internal class …
Run Code Online (Sandbox Code Playgroud)

android storage-access-framework

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

如何在我的位置图层顶部放置标记?

我在使用 GoogleMaps for Android 在位置图层的标记顶部绘制自定义标记时遇到问题。

我的位置层位于自定义标记之上

文档没有提供任何信息如何做到这一点。为标记设置大值zIndex无济于事。

android google-maps

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

RxJava2 可观察的背压

最近我意识到我不明白RxJava2背压是如何工作的。

我做了一个小测试,我希望它会失败但有MissingBackpressureException异常:

@Test
public void testBackpressureWillFail() {
    Observable.<Integer>create(e -> {
        for (int i = 0; i < 10000; i++) {
            System.out.println("Emit: " + i);
            e.onNext(i);
        }
        e.onComplete();
    })
    .subscribeOn(Schedulers.newThread())
    .observeOn(Schedulers.computation())
    .doOnNext(i -> {
        Thread.sleep(100);
        System.out.println("Processed:" + i);
    })
    .blockingSubscribe();
}
Run Code Online (Sandbox Code Playgroud)

系统输出显示如下:

Emit: 0
Emit: 1
Emit: 2
...
Emit: 10000

Processed:0
Processed:1
Processed:2
...
Processed:10000
Run Code Online (Sandbox Code Playgroud)

为什么它不产生MissingBackpressureException.

我希望e.onNext(i);将项目放入缓冲区,ObservableObserveOn并且在其大小大于static final int BUFFER_SIZE = Math.max(16,Integer.getInteger("rx2.buffer-size",128).intValue());

它应该抛出MissingBackpressureException不会发生的情况。缓冲区会自动增长吗?如果不是,物品存放在哪里?

java backpressure rx-java rx-java2

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

如何捕捉截图?

我知道有很多关于捕获屏幕截图的问题,我已经检查了大部分屏幕截图.他们有相同的答案(代码变化很小).

我有以下截图捕获方法:

@NonNull
public static Bitmap takeScreenShot(Window window) throws IOException {
    final View rootView = window.getDecorView().getRootView();
    final boolean drawingCacheEnabled = rootView.isDrawingCacheEnabled();
    rootView.setDrawingCacheEnabled(true);

    try {
        return Bitmap.createBitmap(rootView.getDrawingCache());
    } finally {
        rootView.setDrawingCacheEnabled(drawingCacheEnabled);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它: takeScreenShot(getActivity().getWindow())

但是这些方法有几个局限性:

  1. 如果屏幕上有一些对话框,则不会在屏幕截图中捕获这些对话框.
  2. 它是否适用于硬件加速视图?根据文件:

    打开硬件加速时,启用
    绘图缓存对渲染没有影响,因为系统使用
    不同的加速机制忽略标记

  3. 屏幕截图包含黑框而不是GLviews.(例如,当你的应用程序有地图时.)这似乎是第二点的结果.

所以我的问题是,是否有任何解决方案没有生根可以至少解决我的一些问题?

android screenshot

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

Dart 比较运算符

我正在开发一个测量类,因此我想提供一个很好的 API 来比较两个测量值。

为了处理集合中的排序,我实现了Comparator. 对于一个很好的 API,我还实现了比较运算符<, <=, =>, >, ==

所以我的类有以下方法:

bool operator <=(SELF other) => _value <= other._value;

bool operator <(SELF other) => _value < other._value;

bool operator >(SELF other) => _value > other._value;

bool operator >=(SELF other) => _value >= other._value;

@override
bool operator ==(Object other) =>
    identical(this, other) || other is UnitValue && runtimeType == other.runtimeType && _value == other._value;

@override
int get hashCode => _value.hashCode;

int compareTo(SELF other) …
Run Code Online (Sandbox Code Playgroud)

dart

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

如何设置android:networkSecurityConfig只为单一的味道

我们从特定的flavor(QA)向我们的QA团队提供发布版本apk构建.

我只想补充networkSecurityConfig一点flavor.

为了做到这一点,我需要将下一个配置添加到清单.

    <application android:networkSecurityConfig="@xml/network_security_config"... >
        ...
    </application>
Run Code Online (Sandbox Code Playgroud)

是否可以仅添加此配置QA gradle flavor

防止<debug-overrides>对它的回答对我没有帮助,因为我们向QA提供了版本构建.

android gradle android-gradle-plugin

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

完成或处置Observable/Completed时,RxJava2获取事件

当我订阅Completable并在操作完成后(成功或出错)隐藏它或被取消时,我需要显示进度对话框.

所以我这样做

final Completable completable = notificationRepository.markAllAsRead()
        .doOnSubscribe(d -> progressDialog.show())
        .doOnError(error -> progressDialog.dismiss())
        .doOnComplete(() -> progressDialog.dismiss())
        .doOnDispose(() -> progressDialog.dismiss());
Run Code Online (Sandbox Code Playgroud)

是否有任何优雅的方式,什么时候能得到一个回调 onError,onCompleteonDispose发生什么呢?

android rx-java rx-java2

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

是否可以在 Flutter 中不添加 Android 插件的情况下使用 PlatformView?

我有一个PlatformView用于在我的 Flutter 应用程序中显示地图。平台视图位于插件中,因此它PluginRegistry可以使用方法访问并注册平台视图PlatformViewRegistry platformViewRegistry()

但是,我想将它从插件移动到主项目,以便将所有内容保留在一个项目中。

这可能platformViewRegistry吗,在这种情况下我应该如何访问?

flutter flutter-plugin

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