libc: pthread_create не удалось: не удалось выделить 1040384-байтовый стек: недостаточно памяти - PullRequest
0 голосов
/ 11 октября 2018

У меня есть EventBus(), который запускается и зацикливается до тех пор, пока он не перейдет к моему другому Fragment при запуске моего приложения.когда я бездействую приложение не менее 30 ++ минут, я получаю следующую трассировку стека:

10-11 10:23:46.315 3790-4797/com.jti.mikee.jti_pos W/libc: pthread_create failed: couldn't allocate 1040384-byte stack: Out of memory
10-11 10:23:46.315 3790-4797/com.jti.mikee.jti_pos E/dalvikvm: pthread_create (stack size 16384 bytes) failed: Try again

Я также использую ScheduleExecutorService() на onCreateView()

scheduledExecutorService = Executors.newScheduledThreadPool(4);

Этообъявление моего EventBus()

 public static final Runnable mRunnable = new Runnable() {
    @Override
    public void run() {
        EventBus.getDefault().post(new EB_TapCard());
    }
};

и на моем onResume() это код

 @Override
public void onResume() {
    Log.e("current_module",current_module);

    super.onResume();
    try {
        EventBus.getDefault().register(this);
        rfscanner = scheduledExecutorService.scheduleAtFixedRate(mRunnable, 0, 2, TimeUnit.SECONDS);
    } catch (Throwable e) {
        e.printStackTrace();
    }
}

и, наконец, это мой onPause() метод

 @Override
public void onPause() {
    try {
        getContext().unregisterReceiver(broadcastReceiver);
    } catch (Throwable e) {
        e.printStackTrace();
    }
    rfscanner.cancel(true);
    EventBus.getDefault().unregister(this);
    super.onPause();
}

Мне интересно, что когда я бездействую мое устройство, Runnable все еще работает.Как я могу приостановить / возобновить это?очень ценится.

EDIT

На данный момент я попытался добавить функцию Callback().Работает хорошо, но после того, как я нажимаю на карту, устройство чтения карт не читает вторую карту.как я могу сделать это без заполнения памяти ??

class CallBackThread extends Thread {

    @Override
    public void run() {

        try {
            RFCardInterface.waitForCardPresent(RFCardInterface.CONTACTLESS_CARD_MODE_AUTO, 1, -1);
            if (RFCardInterface.isCallBackCalled &&
                    RFCardInterface.notifyEvent.eventID == RFCardInterface.CONTACTLESS_CARD_EVENT_FOUND_CARD) {

                IDCatcher = StringUtility.ByteArrayToString(RFCardInterface.notifyEvent.eventData,
                        RFCardInterface.notifyEvent.eventData.length);

                IDCatcher = IDCatcher.substring(9, 21).replace(" ", "");
                Log.e("IDCatcher", IDCatcher);


                EventBus.getDefault().post(new EBTest2());
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

1 Ответ

0 голосов
/ 11 октября 2018

Попробуйте что-нибудь в этом духе:

private Handler mHandler;                           // the handler to this activity
private Runnable mCallback;        // the callback to 2s loop

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...
    mHandler = new Handler();
    mCallback = new Runnable() {
        @Override
        public void run() {
            EventBus.getDefault().post(new EB_TapCard());
            // schedule next run here
            scheduleNextRun();            
        }
    };
}

@Override
public void onResume() {
    scheduleNextRun();
} 

@Override
public void onPause() {
    cleanUpRun();
} 

@Override
public void onDestroy() {
    // needed in case the system will force-kill your process
    cleanUpRun();
} 

private void cleanUpRun() {
    if (mHandler != null) {
        mHandler.removeCallbacks(mCallback);
    }
}

private void scheduleNextRun() {
    // clean up beforehand
    cleanUpRun();
    if (mHandler != null) {
        mHandler.postDelayed(mCallback, 2000L);
    }
}

Идея состоит в том, что каждый раз, когда вы заходите на страницу, вы задерживаете запуск своего приложения и удаляете его, когда выходите;как только вы запустите его, и он выполнит обратный вызов, вы запланируете следующий запуск и т. д.

...