Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.OutOfMemoryError:无法在handlerthread.start()处分配JNI Env_Android_Multithreading_Out Of Memory_Android Handlerthread - Fatal编程技术网

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非常感谢您的回复。另外,您对退出循环器或处理程序线程有何想法?我仍然不知道在哪里关闭它们。我想这可能就是问题所在。谢谢