2015-09-09 4 views
9

मुझे अपना आवेदन में एक AsyncTask है:सेना एक अवरुद्ध रोक AsyncTask

public class myActivity extends Activity { 
    private static Socket mySocket; 
    private static InputStream myInputstream; 
    private AsyncTask task; 
    private boolean connected = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ...    
     task = new UpdateTask().execute(); 
     ... 
    } 

    private class myTask extends AsyncTask<Void, String, String> { 
     @Override 
     protected String doInBackground(Void... v) { 
      if(!connected) { 
       try { 
        mySocket = new Socket(); 
        mySocket.connect(new InetSocketAddress(MYIP, MYPORT)); 
        myInputstream = mySocket.getInputStream(); 
        connected = true; 
       } catch(IOException e) { ... } 
      } 

      while(connected && !isCancelled()) { 
       byte[] readbyte = new byte[1024]; 
       try { 
        myInputstream.read(readbyte); 
       } catch (IOException e) { ... } 
       ... 
      } 
      return null; 
     } 
     ... 
    } 

और मैं AsyncTask task को रोकने के लिए जब मैं अपने अनुप्रयोग को बंद करना चाहते हैं: (प्रेस वापस putton)। मैं इस सवाल का जवाब यहाँ Android - Cancel AsyncTask ForcefullyisCancelled()

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK) { 
      task.cancel(true); 
      mySocket.close(); 
      finish(); 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

जाँच करने की कोशिश की लेकिन ऐसा लगता है कि आवेदन myInputstream.read(readbyte) पर अवरुद्ध कर देगा जब task.cancle(true) कहा जाता है। एंड्रॉइड एक "ऐप जवाब देना बंद कर देगा .." मुझे पॉप-अप करें। मैं अवरुद्ध पढ़ने को रोकने के लिए कैसे मजबूर कर सकता हूं?

+0

क्या आप doInBackground में किसी भी अपवाद को पकड़ते हैं? एक interruptedException होना चाहिए। – Fildor

+0

@ फ़ील्ड यह 'java.io.InterruptedIOException' होना चाहिए, लेकिन केवल तभी जब स्ट्रीम बाधा का समर्थन करे। – SpaceTrucker

+0

आप कहते हैं "ऐसा लगता है कि एप्लिकेशन' myInputstream.read (readbyte) 'पर अवरुद्ध होगा। आप कितने निश्चित हैं कि वास्तव में यह मामला है? – SpaceTrucker

उत्तर

0

java.io.InputStream I/O अवरुद्ध करने वाले उपकरण लागू करता है। यह उम्मीद है कि आपके आवेदन

myInputstream.read(readbyte) 

पर अवरुद्ध कर देगा जब तक read आपरेशन -1 जिसका अर्थ है कि वहाँ कोई और अधिक डेटा स्ट्रीम से पढ़ें (के रूप में यह बंद हो गया या कनेक्शन समाप्त किया गया) या अपवाद फेंकने के लिए वापस आ जाएगी।

स्ट्रीम पर डेटा के लिए प्रतीक्षा थ्रेड को अनब्लॉक करने का एकमात्र तरीका इसे बंद करना है। आपके मामले में आप

mySocket = new Socket(); 

लाइन में Socket बनाई बंद करने के लिए सक्षम होना चाहिए।

mySocket.close(); 

अपने पढ़ने को बाधित करना चाहिए। लेकिन ध्यान रखें कि Socket.close() वास्तव में

इस सॉकेट को बंद करता है।

इस सॉकेट पर वर्तमान में I/O ऑपरेशन में अवरुद्ध कोई भी थ्रेड सॉकेट अपवाद फेंक देगा।

तो तुम काम चलने का अवरोध हटा मिल जाएगा, लेकिन आप सभी कार्यों को समाप्त करने के लिए अपने कार्य में सही ढंग से SocketException को संभालने के लिए है (शायद यह है कि क्या आप याद कर रहे हैं) है।

FYI करें

task.cancel(true); 

बुला ज्यादा मतलब नहीं है क्योंकि यह केवल काम पर cancelled ध्वज सेट करता है। ध्वज की जांच करने के लिए आपके कोड की ज़िम्मेदारी है और I/O को अवरुद्ध करने के साथ आपको ऐसा करने की कोई संभावना नहीं है।

वैकल्पिक रूप से आपको गैर-अवरुद्ध I/O का उपयोग करने पर विचार करना चाहिए।