1

My application started to crash at handlerthread.start() line. Following is the full stack traces.

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)

This is the find method where the application crashes.

handlerThread.start(); line is the crashing point. Maybe I should have quit from the thread but I do not know where to quit because this class is not an activity so it does not have any onDestroy or onTerminate methods. But I read that they are closing themselves at the end of the run method.

@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))
                );
            }
        });

    }
}

Any help would be appreciated. Thanks in advance.

Hilal
  • 902
  • 2
  • 22
  • 47
  • 1
    I can't answer what went wrong here, but be aware that Java uses `OutOfMemoryError` for other problems besides just running out of heap space. (E.g., `Thread.start()` could throw `OutOfMemoryException` for any of several different reasons why it failed to create the new thread.) – Solomon Slow Dec 30 '19 at 23:44
  • @SolomonSlow Thank you so much for your reply. Also do you have any idea about quitting from the loopers or handler threads? I have still could not figure out where to close them. I suspect that might be the problem. Thanks – Hilal Jan 01 '20 at 23:29

0 Answers0