2012-02-11 2 views
0

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

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

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

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

Вопрос заключается в том, если это асинхронное так, если выполнение продолжается в цикле
whilestopNow = 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) {} 
       }  
      } 
     } 
    } 
} 

ответ

0

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

stopNow = true; 

try{ 
    if(socket != null){ 
     socket.shutdownOutput(); 
     socket.shutdownInput(); 
    } 
} catch (Exception e) {}  
-1

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(); 
       } 
+0

Спасибо человеку, что не знаю, что сказать сейчас :) – Erik