小编Pau*_*hek的帖子

MediaMetadataRetrieverJNI:getEmbeddedPicture失败

我正在使用android并遍历数百个mediafile,以找到第一张嵌入式图片,效果很好,但在我的logcat中却发了很多错误。

我正在使用此代码:

for (String s : ArrayList <String> paths){
    MediaMetadataRetriever mmr = new MediaMetadataRetriever();
    mmr.setDataSource(path);
    byte[] data = mmr.getEmbeddedPicture();
    if (data != null) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

它记录的错误是:

E/MediaMetadataRetrieverJNI? getEmbeddedPicture: Call to getEmbeddedPicture failed.
E/MediaMetadataRetrieverJNI? getEmbeddedPicture: Call to getEmbeddedPicture failed.
E/MediaMetadataRetrieverJNI? getEmbeddedPicture: Call to getEmbeddedPicture failed.
E/MediaMetadataRetrieverJNI? getEmbeddedPicture: Call to getEmbeddedPicture failed.
E/MediaMetadataRetrieverJNI? getEmbeddedPicture: Call to getEmbeddedPicture failed.
E/MediaMetadataRetrieverJNI? getEmbeddedPicture: Call to getEmbeddedPicture failed.
.....
Run Code Online (Sandbox Code Playgroud)

我使用的对吗?如果可以,则可以抑制该错误,这会使调试变得烦人。根据MediaMetadataRetriever,它应该简单地返回null

java android mediametadataretriever

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

Java并发:协调多个任务并取消

我正在寻找协调多个多线程任务的好解决方案.

基本上我有2个任务,我打电话AB需要被不同的线程比主线程中执行.

B必须在A完成后开始.A而且他们B自己包含几个应该并行运行的部分,叫做A1, A2, ... B1, B2, ....

并且有一个来自外部的呼叫者,无论进度如何,都需要重新启动整个工作.我怎么能这样做呢?如果每个子任务(A1,...)已经完成,我想创建一些保存信息的布尔数组,如果是,则启动B.如果已经取消,则检查每个方法中的每几行代码.但在我看来,这不是一个优雅的解决方案,并且有可能以令人兴奋的方式协调这一点.

在此输入图像描述

java concurrency multithreading

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

Disposeable for Observer

在RxJava 1中,订阅Observer返回了一个可以取消订阅的订阅.

在RxJava 2中,使用Observer订阅返回void并且没有Disposeable.怎么可能停止"订阅"?

// v1
rx.Observable<Long> v1hot = rx.Observable.interval(1, TimeUnit.SECONDS);
rx.Observer<Long> v1observer = new TestSubscriber<>();
Subscription subscription = v1hot.subscribe(v1observer);
subscription.unsubscribe();

// v2
Observable<Long> v2hot = Observable.interval(1, TimeUnit.SECONDS);
Observer<Long> v2Observer = new TestObserver<>();
v2hot.subscribe(v2Observer); // void
Run Code Online (Sandbox Code Playgroud)

编辑:如何处理案例,我们使用一个本身不实现的观察者Disposable,如BehaviorSubject?就像在这个例子中:

// v1
rx.Observable<Long> v1hot = rx.Observable.interval(1, TimeUnit.SECONDS);
rx.Observer<Long> v1observer = rx.subjects.BehaviorSubject.create();
Subscription subscription = v1hot.subscribe(v1observer);
subscription.unsubscribe();

// v2
Observable<Long> v2hot = Observable.interval(1, TimeUnit.SECONDS);
Observer<Long> v2Observer = BehaviorSubject.createDefault(-1L);
v2hot.subscribe(v2Observer); // void
Run Code Online (Sandbox Code Playgroud)

rx-java rx-java2

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

Kotlin:内在范围 - 这个

我刚刚使用了Kotlins自动重构器,它基本上让我这样:

coverView.viewTreeObserver.addOnPreDrawListener {
    coverView.viewTreeObserver.removeOnPreDrawListener(this)
    true
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用.IntelliJ向我展示了this引用外部类但不引用OnPreDrawListener.这是为什么?kotlin文档说这总是指最内在的范围.

kotlin

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

与RxJava结合了解Android内存泄漏

我仍然不明白内存泄漏是如何出现的.

我知道如果使用的东西(如单例)持有对其他的引用,则此对象不能被垃圾收集并且可用内存会关闭.

但是在这种情况下会发生什么?我使用RxBinding从单击事件创建和Observable.范围在这里,它说:

警告:创建的observable保留对{@code view}的强引用.取消订阅以免费提供此参考.

为什么这有必要?当我在onCreate中将手动监听器设置为匿名内部类时,它会引用该活动,对吧?但为什么整个activity-view-observable-subscription不能再被垃圾收集?

java android memory-leaks rx-java rx-android

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

RxJava:丢弃物品?- 背压

我使用RxJava观察几个按钮上的点击.

这些订阅将在一个对象上调用不同的函数,这需要几毫秒.这些功能是同步的.

问题是,当按下太多按钮时,我会得到一个背压异常.对我来说有用的是丢弃几个输入(最好是oldes).RxJava可以吗?

java backpressure rx-java

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

压倒平等:告诉IDE可以有不同的价值观吗?

假设,我有一个班级,称之为学生.student类有一个元素,一个名为Id的int.我想覆盖equals,因此如果将Student与Integer进行比较,则该方法返回true.喜欢:

public class OverrideTest {
    public static void main(String[] args) {

        Student a = new Student();
        a.setId(5);
        System.out.println(a.equals(5));
    }

    public static class Student {

        private int id;

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        @Override
        public boolean equals(Object o) {
            if (o instanceof Student) {
                Student a = (Student) o;
                if (a.getId() == this.getId())
                    return true;
            }
            if (o == this)
                return true;
            if (o instanceof Integer) {
                int id = …
Run Code Online (Sandbox Code Playgroud)

java jvm

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

使Executor转储队列的一部分

目前我正在使用Executor:

Executors.newSingleThreadExecutor();
Run Code Online (Sandbox Code Playgroud)

但我的问题是,如果我把它放得太多,那么它们的执行速度太慢而且我的UI会在执行程序完成时挂起.所以我希望它表现得很好,执行者只能一次执行任务.但是当提交新任务时,如果有超过5个任务,我希望他放弃排队任务.

那可能吗?

java executor

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