我正在使用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
我正在寻找协调多个多线程任务的好解决方案.
基本上我有2个任务,我打电话A和B需要被不同的线程比主线程中执行.
但B必须在A完成后开始.A而且他们B自己包含几个应该并行运行的部分,叫做A1, A2, ... B1, B2, ....
并且有一个来自外部的呼叫者,无论进度如何,都需要重新启动整个工作.我怎么能这样做呢?如果每个子任务(A1,...)已经完成,我想创建一些保存信息的布尔数组,如果是,则启动B.如果已经取消,则检查每个方法中的每几行代码.但在我看来,这不是一个优雅的解决方案,并且有可能以令人兴奋的方式协调这一点.

在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) 我刚刚使用了Kotlins自动重构器,它基本上让我这样:
coverView.viewTreeObserver.addOnPreDrawListener {
coverView.viewTreeObserver.removeOnPreDrawListener(this)
true
}
Run Code Online (Sandbox Code Playgroud)
哪个不起作用.IntelliJ向我展示了this引用外部类但不引用OnPreDrawListener.这是为什么?kotlin文档说这总是指最内在的范围.
我仍然不明白内存泄漏是如何出现的.
我知道如果使用的东西(如单例)持有对其他的引用,则此对象不能被垃圾收集并且可用内存会关闭.
但是在这种情况下会发生什么?我使用RxBinding从单击事件创建和Observable.范围在这里,它说:
警告:创建的observable保留对{@code view}的强引用.取消订阅以免费提供此参考.
为什么这有必要?当我在onCreate中将手动监听器设置为匿名内部类时,它会引用该活动,对吧?但为什么整个activity-view-observable-subscription不能再被垃圾收集?
我使用RxJava观察几个按钮上的点击.
这些订阅将在一个对象上调用不同的函数,这需要几毫秒.这些功能是同步的.
问题是,当按下太多按钮时,我会得到一个背压异常.对我来说有用的是丢弃几个输入(最好是oldes).RxJava可以吗?
假设,我有一个班级,称之为学生.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) 目前我正在使用Executor:
Executors.newSingleThreadExecutor();
Run Code Online (Sandbox Code Playgroud)
但我的问题是,如果我把它放得太多,那么它们的执行速度太慢而且我的UI会在执行程序完成时挂起.所以我希望它表现得很好,执行者只能一次执行任务.但是当提交新任务时,如果有超过5个任务,我希望他放弃排队任务.
那可能吗?
java ×6
rx-java ×3
android ×2
backpressure ×1
concurrency ×1
executor ×1
jvm ×1
kotlin ×1
memory-leaks ×1
rx-android ×1
rx-java2 ×1