2013-07-30 8 views
7

मेरे पास हैंडलर थ्रेड है, जिसमें मैं हर 5 सेकंड में एक रननेबल पोस्ट करता रहता हूं। कुछ इस तरह:हैंडलर थ्रेड के लूपर को सुरक्षित रूप से कैसे छोड़ें

HandlerThread thread = new HandlerThread("MyThread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()); 
handler.post(new Runnable() { 
    public void run() { 
    //... 
    handler.postDelayed(this, 5000); 
    } 
}); 

मैं, कुछ बिंदु पर looper छोड़ने की 60 सेकंड या ऐसा ही कुछ होने के बाद की जरूरत है .. तो मैं लिखना:

mainHandler = new Handler(Looper.myLooper()); //main thread's 
mainHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    thread.getLooper().quit(); 
    } 
}, 60000); 

मैं इस looper अचानक छोड़ने का कारण बनता है लगता है

डब्ल्यू/MessageQueue (3726): java.lang.RuntimeException: हैंडलर (android.os.Handler) {} 4823dbf8 एक मरे हुए पर एक हैंडलर के लिए संदेश भेजने, तो मैं हो रही इस "चेतावनी" संदेशों शुरू धागा

मैं यह त्रुटि संदेश से बचना चाहते हैं, मैंने सोचा कि मैं इसे Looper.quitSafely() विधि का उपयोग कर हल कर सकते थे .. लेकिन मैं API की जाँच की और यह अब उपलब्ध नहीं है। क्या किसी को पता है कि इसके साथ क्या हुआ? (यह को कुछ अन्य तरीकों से वंचित नहीं किया गया है)।

क्या कोई तरीका है कि मैं लूपर को सुरक्षित रूप से छोड़ सकता हूं? धन्यवाद!

+0

रोक handler.postDelayed भेजने (इस, 5000) Runnables – pskink

+0

देरी एक झंडा या कुछ का उपयोग कर की तरह? – sundie

+0

शायद आप thread.getLooper() को छोड़ सकते हैं। छोड़ें सुरक्षित()? – Richard

उत्तर

0

इम गुरु थ्रेड नहीं है, लेकिन इस तरह से आप दिशा दे सकते हैं:

... 
_thread.setRunning(true); 
_thread.start(); 

.. 

public void stopThread(){ 
    boolean retry = true; 
    _thread.setRunning(false); 
    while (retry) { 
     try { 
      _thread.join(); 
      retry = false; 
      Log.e("test", "thread stopped"); 
     } catch (InterruptedException e) { 
      Log.e("test", "can't stop thread, retrying..."); 
      // we will try it again and again... 
     } 
    } 
} 

अपने धागा में:

while (isRunning) { 
    //... 
} 

1 सब आप पाश (while(isRunnig){}) में run विधि को लागू।

खत्म होने पर, आप ध्वज को ध्वजांकित करते हैं और join के लिए "प्रतीक्षा करें"।

1

आप यह जानने के लिए एक बूलियन का उपयोग करने का प्रयास कर सकते हैं कि कोड निष्पादित किया जाना चाहिए या नहीं। कुछ इस तरह:

private boolean runHandler = true; 

... 

HandlerThread thread = new HandlerThread("MyThread"); 
thread.start(); 
Handler handler = new Handler(thread.getLooper()); 
handler.post(new Runnable() { 
    public void run() { 
     if(runHandler){ 
      //... 
      handler.postDelayed(this, 5000); 
     } 
    }  
}); 

mainHandler = new Handler(Looper.myLooper()); //main thread's 
mainHandler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     runHandler = false; 
    } 
}, 60000); 
+0

धन्यवाद, यह एक साधारण कामकाज है :) – sundie

+0

क्या होगा यदि मेरे पास कई सारे हैंडलथ्रेड हैं? मेरा मतलब है कि मैं प्रत्येक धागे के लिए एक बूलियन नहीं रखना चाहता ...: पी – sundie

+0

हां, उस स्थिति में आपको हैंडलर को रोकने के लिए एक रास्ता तलाशना चाहिए। मुझे लगता है हैंडलर-> हटाएं अगर संदेश कतार में है तो कॉलबैक काम करेगा, लेकिन अगर हैंडलर निष्पादित किया जा रहा है तो मुझे यकीन नहीं है कि यह निष्पादन को रोक देगा या नहीं। –

संबंधित मुद्दे