दिलचस्प पोस्ट
क्यों नहीं ICloneable <टी>? नेटी बनाम अपाचे मिना क्या विशेष रूप से eval के खतरों (पार्स (…)) हैं? गतिशील संसाधन लोड हो रहा है एंड्रॉइड आईओएस में छवि अपलोड कोड के साथ और पैरामीटर कैसे पोस्ट करें? आर में दशमलव स्थानों का प्रारूपण करना क्या मैं दूसरी फ़ाइल से चर का उपयोग कर सकता हूं? यूनिट्स के लिए लिनक्स बनाम ग्रुपजॉइन में शामिल हों मैं स्थानीय जीआईटी शाखा का नाम कैसे बदलूं? दो तिथियों की तुलना कैसे करें? क्या कोई एचटीटीपी / एचटीटीपीएस अवरोधन उपकरण जैसे मैक ओएस एक्स के लिए फिडलर हैं? क्या मैं JOIN की स्थिति में केस का उपयोग कर सकता हूँ? दो साझा पुस्तकालयों को एक ही प्रतीक के साथ जोड़ना IPython / jupyter नोटबुक कार्य निर्देशिका बदलें एचटीटीपीएलएलटी के साथ एएसपी.नेट वेब एपीआई सेवा को प्रमाणित करने में असमर्थ

हैंडलरथ्रेड के साथ संचार का उदाहरण

मैं जीयूआई थ्रेड से हैंडलर थ्रेड को सेट करना चाहता हूं फिर कुछ समय बाद, जब एक बटन GUI पर क्लिक किया जाता है, तो यह कॉलहोल्लो () चलाता है, जो तब गैर-जीयूआई थ्रेड पर रहने वाले एक HelloLogger ऑब्जेक्ट को संदेश भेजता है, जो "हैलो वर्ल्ड" लॉग इन करता है। मैंने कई चीजों की कोशिश की है, कुछ ब्लॉक अनिश्चित काल के लिए, कुछ को कभी भी संदेश, आदि प्राप्त नहीं होता है। नीचे दिए गए कोड मेरे पास जितना पास हो उतना कम है, कृपया कोई इसे काम करने के लिए संशोधित कर सकता है?

public class HandlerThreadExample { private MyHandlerThread mMyHandlerThread; private Looper mLooper; private Handler mHandler; public HandlerThreadExample(){ mMyHandlerThread = new MyHandlerThread(); mMyHandlerThread.start(); mLooper = mMyHandlerThread.getLooper(); } public void callHello() { mHandler.sendEmptyMessage(1); } private class MyHandlerThread extends HandlerThread { private HelloLogger mHelloLogger; private Handler mHandler; public MyHandlerThread() { super("The MyHandlerThread thread", HandlerThread.NORM_PRIORITY); } public void run (){ mHelloLogger = new HelloLogger(); mHandler = new Handler(getLooper()){ public void handleMessage(Message msg){ mHelloLogger.logHello(); } }; super.run(); } } private class HelloLogger { public HelloLogger (){ } public void logHello(){ Log.d("HandlerThreadExample", "Hello World"); } } } 

सर्वोत्तम उदाहरण मिले:

  • हैंडलर थ्रेड टेस्ट
  • लूपर थ्रेड कैसे बनाएं, फिर उसे तत्काल संदेश भेजें?
  • हैंडलर के साथ एसिंक कॉल
  • HandlerThread बनाम एक्जीक्यूट – जब दूसरे पर एक और अधिक उपयुक्त होता है?
  • अन्य समान वर्गों पर हैंडलर का सर्वोत्तम उपयोग करें
  • एंड्रॉइड हैंडलरथाफ्रेड
  • HandlerThread उदाहरण
  • एंड्रॉइड: मुख्य और कार्यकर्ता धागे के बीच डेटा पासिंग
  • जावा सिंक्रनाइज़
  • गतिविधि धागा कतार और हैंडलर वर्ग का उपयोग करते हुए धागे के बीच संदेशों को भेजा जा रहा है
  • लूपर्स और हैंडलर के लिए परिचय
  • डेवलपर। एंड्रॉइड: थ्रेड पर चलाना कोड निर्दिष्ट करना

कम से कम अब मैं तिलंदिनी टैब बंद कर सकता हूं

समाधान से शिष्टाचार की मदद से शिष्टाचार

 public class HandlerThreadExample2 { private static int MSG_START_HELLO = 0; private static int MSG_HELLO_COMPLETE = 1; private HandlerThread ht; private Handler mHtHandler; private Handler mUiHandler; private boolean helloReady = false; public HandlerThreadExample2(){ ht = new HandlerThread("The new thread"); ht.start(); Log.d(App.TAG, "UI: handler thread started"); mUiHandler = new Handler(){ public void handleMessage(Message msg){ if (msg.what == MSG_HELLO_COMPLETE){ Log.d(App.TAG, "UI Thread: received notification of sleep completed "); helloReady = true; } } }; mHtHandler = new Handler(ht.getLooper()){ public void handleMessage (Message msg){ if (msg.what == MSG_START_HELLO){ Log.d(App.TAG, "handleMessage " + msg.what + " in " + Thread.currentThread() + " now sleeping"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(App.TAG, "Woke up, notifying UI thread..."); mUiHandler.sendEmptyMessage(MSG_HELLO_COMPLETE); } } }; } public void sendLongHello(){ if (helloReady){ Log.d(App.TAG, "sending hello " + Thread.currentThread()); mHtHandler.sendEmptyMessage(MSG_START_HELLO); helloReady = false; } else { Log.e(App.TAG, "Cannot do hello yet - not ready"); } } } 

वेब के समाधान से एकत्रित समाधान "हैंडलरथ्रेड के साथ संचार का उदाहरण"

यह एक कामकाजी उदाहरण है:

 HandlerThread ht = new HandlerThread("MySuperAwesomeHandlerThread"); ht.start(); Handler h = new Handler(ht.getLooper()) { public void handleMessage(Message msg) { Log.d(TAG, "handleMessage " + msg.what + " in " + Thread.currentThread()); }; }; for (int i = 0; i < 5; i++) { Log.d(TAG, "sending " + i + " in " + Thread.currentThread()); h.sendEmptyMessageDelayed(i, 3000 + i * 1000); } 

अद्यतन :

दो वर्ग फ़ील्ड बनाएं:

 Handler mHtHandler; Handler mUiHandler; 

और यह प्रयास करें:

 HandlerThread ht = new HandlerThread("MySuperAwsomeHandlerThread"); ht.start(); Callback callback = new Callback() { @Override public boolean handleMessage(Message msg) { if (msg.what == 0) { Log.d(TAG, "got a meaasage in " + Thread.currentThread() + ", now sleeping... "); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.d(TAG, "woke up, notifying ui thread..."); mUiHandler.sendEmptyMessage(1); } else if (msg.what == 1) { Log.d(TAG, "got a notification in " + Thread.currentThread()); } return false; } }; mHtHandler = new Handler(ht.getLooper(), callback); mUiHandler = new Handler(callback); mHtHandler.sendEmptyMessageDelayed(0, 3000); 

आप निश्चित रूप से Callback इंटरफ़ेस से छुटकारा पा सकते हैं और ओवरराइड handleMessage विधि के साथ दो हैंडलर्स बना सकते हैं …

आप जिस मुद्दे को देख रहे हैं, वह है क्योंकि आपका बाहरी वर्ग निजी mHandler फ़ील्ड का उपयोग कर रहा है और आपकी हैंडलरथ्रेड भी ऐसा करता है बाहरी कक्षा का क्षेत्र आरंभ नहीं किया गया है। आपको भीतर के mHandler की आवश्यकता नहीं है बाहरी कक्षा आपसे शुरू करने के तुरंत बाद लूटने वाले हैंडलर को पकड़ कर सकते हैं ()।