Android java.lang.OutOfMemoryError:无法在handlerthread.start()处分配JNI Env
我的应用程序在Android java.lang.OutOfMemoryError:无法在handlerthread.start()处分配JNI Env,android,multithreading,out-of-memory,android-handlerthread,Android,Multithreading,Out Of Memory,Android Handlerthread,我的应用程序在handlerthread.start()行开始崩溃。下面是完整的堆栈跟踪 Caused by java.lang.OutOfMemoryError: Could not allocate JNI Env at java.lang.Thread.nativeCreate(Thread.java) at java.lang.Thread.start(Thread.java:1063) at br.com.gomus.androidapp.da
handlerthread.start()
行开始崩溃。下面是完整的堆栈跟踪
Caused by java.lang.OutOfMemoryError: Could not allocate JNI Env
at java.lang.Thread.nativeCreate(Thread.java)
at java.lang.Thread.start(Thread.java:1063)
at br.com.gomus.androidapp.data.local.dao.artitist.ArtistDaoImpl.find(ArtistDaoImpl.java:96)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.MusicPlayerRepositoryImpl.getSongInfo(MusicPlayerRepositoryImpl.java:105)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.MusicPlayerRepositoryImpl.lambda$getMediaModel$4(MusicPlayerRepositoryImpl.java:68)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.-$$Lambda$MusicPlayerRepositoryImpl$fVfeeQmYGFkPz-ojRma96o5CY3o.call(lambda)
at rx.Observable.unsafeSubscribe(Observable.java:10256)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:148)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
at rx.internal.operators.OnSubscribeFilter$FilterSubscriber.onNext(OnSubscribeFilter.java:76)
at rx.internal.operators.OperatorMerge$MergeSubscriber.emitScalar(OperatorMerge.java:395)
at rx.internal.operators.OperatorMerge$MergeSubscriber.tryEmit(OperatorMerge.java:355)
at rx.internal.operators.OperatorMerge$InnerSubscriber.onNext(OperatorMerge.java:846)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.MusicPlayerRepositoryImpl.lambda$null$6(MusicPlayerRepositoryImpl.java:90)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.-$$Lambda$MusicPlayerRepositoryImpl$hAG_T0swae9XDVx8RuKzvo4UVIs.call(lambda)
at br.com.gomus.androidapp.data.local.dao.song.SongDaoImpl.lambda$findFirst$14(SongDaoImpl.java:207)
at br.com.gomus.androidapp.data.local.dao.song.-$$Lambda$SongDaoImpl$g3Egrx7TYpSF8dU-ZLdsO2a2hF4.call(lambda)
at br.com.gomus.androidapp.data.local.database.LocalDatabaseImpl.findFirst(LocalDatabaseImpl.java:420)
at br.com.gomus.androidapp.data.local.dao.song.SongDaoImpl.findFirst(SongDaoImpl.java:205)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.MusicPlayerRepositoryImpl.lambda$onGetSong$7(MusicPlayerRepositoryImpl.java:84)
at br.com.gomus.androidapp.data.local.repository.mediaplayer.music.-$$Lambda$MusicPlayerRepositoryImpl$eDMkgrqdvy5edHNcD0lzalXKrP0.call(lambda)
at rx.Observable.unsafeSubscribe(Observable.java:10256)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:248)
at rx.internal.operators.OperatorMerge$MergeSubscriber.onNext(OperatorMerge.java:148)
at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:77)
at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:224)
at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
这是应用程序崩溃的find方法
handlerThread.start()代码>行是崩溃点。也许我应该退出线程,但我不知道从哪里退出,因为这个类不是活动,所以它没有任何onDestroy或onTerminate方法。但是我看到他们在run方法的末尾关闭了自己
@Override
public void find(Func1<RealmQuery<Artist>, RealmQuery<Artist>> query,
Action1<Result<List<Artist>>> onResult) {
if (query != null) {
handlerThread = new HandlerThread("MyHandlerThreadArtist");
handlerThread.start();
looper = handlerThread.getLooper();
if(looper == null)
Looper.prepare();
Handler handler = new Handler(looper);
handler.post(new Runnable(){
@Override
public void run() {
Timber.log(Log.DEBUG, "find Thread.currentThread().getName() " + Thread.currentThread().getName());
mDatabase.findRealmObject(Artist.class, query,
result -> {
Timber.log(Log.DEBUG, "findRealmObject Thread.currentThread().getName() " + Thread.currentThread().getName());
onResult.call(Result.getData(Arrays.asList(result.data.toArray(new Artist[]{}))));
}, err -> onResult.call(Result.getError(err))
);
}
});
}
}
@覆盖
公共无效查找(Func1查询,
行动1(结果){
if(查询!=null){
handlerThread=新handlerThread(“MyHandlerThreadArtist”);
handlerThread.start();
looper=handlerThread.getLooper();
if(looper==null)
Looper.prepare();
处理程序=新处理程序(活套);
handler.post(新的Runnable(){
@凌驾
公开募捐{
log(log.DEBUG,“find Thread.currentThread().getName()”+Thread.currentThread().getName());
mDatabase.findRealmObject(Artist.class、query、,
结果->{
log(log.DEBUG,“findRealmObject Thread.currentThread().getName()”+Thread.currentThread().getName());
onResult.call(Result.getData(Arrays.asList(Result.data.toArray(new Artister[]{})));
},err->onResult.call(Result.getError(err))
);
}
});
}
}
任何帮助都将不胜感激。提前感谢。我无法回答这里出了什么问题,但请注意,Java使用OutOfMemoryError
解决堆空间不足以外的其他问题。(例如,Thread.start()
可能会抛出OutOfMemoryException
,原因可能有多种,但它无法创建新线程。)@SolomonSlow非常感谢您的回复。另外,您对退出循环器或处理程序线程有何想法?我仍然不知道在哪里关闭它们。我想这可能就是问题所在。ThanksI无法回答此处出现的问题,但请注意Java使用OutOfMemoryError
解决堆空间不足以外的其他问题。(例如,Thread.start()
可能会抛出OutOfMemoryException
,原因可能有多种,但它无法创建新线程。)@SolomonSlow非常感谢您的回复。另外,您对退出循环器或处理程序线程有何想法?我仍然不知道在哪里关闭它们。我想这可能就是问题所在。谢谢