Является ли BroadcastReceiver достаточно асинхронным, чтобы сделать эту работу - PullRequest
0 голосов
/ 11 февраля 2012

Хотел остановить поток, делающий некоторые загрузки.
Приведенный ниже код работает нормально, когда у меня есть только stopNow = true; и не происходит блокировка.
Я создаю boolean stopNow = false; как поле в моем IntentService.

Так как stopNow работает только тогда, когда соединение продолжается в цикле while
, но не работает, если соединение f.ex устарело и начинает блокироваться.

Я хотел добавить этот код, чтобы действительно остановить блокировку.

if(socket != null){
    socket.shutdownOutput();
    socket.shutdownInput();
}

Вопрос в том, является ли это асинхронным, поэтому, если выполнение продолжается в цикле
while,stopNow = true; остановит это, и я могу поставить сон (5000) после stopNow = true;, и тогда if(socket != null) будет истинным, только если stopNow не имел никакого эффекта.

надеюсь, что вы последуете за мной..

BroadcastReceiver, которые находятся внутри run():

private class MyIncomingListener extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if(intent.getAction().equals(Consts.COM_CARLSBERG_STOPOUTGOING)) {
            String b = intent.getStringExtra(Consts.COM_CARLSBERG_BATCHUUID);
            if(b != null){
                if(b.equals(batch.batchUuid)){
                    stopNow = true;
                    // sleep(5000) wait for stopNow to take effect
                    // if socket=null then stopNow did it's job
                    // if socket is alive then there is blocking to unblock
                try{
                    if(socket != null){
                        socket.shutdownOutput();
                        socket.shutdownInput();
                    }
                } catch (Exception e) {}
               }    
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 05 июля 2012

это на самом деле хорошо работает до сих пор

    stopNow = true;

try{
    if(socket != null){
        socket.shutdownOutput();
        socket.shutdownInput();
    }
} catch (Exception e) {}    
0 голосов
/ 11 февраля 2012

public final void stop ()
Since: API Level 1
This method is deprecated.
because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state.

Requests the receiver Thread to stop and throw ThreadDeath. The Thread is resumed if it was suspended and awakened if it was sleeping, so that it can proceed to throw ThreadDeath.



 try {
                     int waited = 0;
                     while(_active && (waited < _splashTime)) {
                         sleep(100);
                         if(_active) {
                             waited += 100;
                         }
                     }
                 } catch(InterruptedException e) {
                     // do nothing
                 } finally {
                     finish();
                     Intent intent= new Intent(SplashActivity.this,LoginViewController.class);
                     startActivity(intent);

                     stop();
                 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...