2013-04-04 9 views
7

मेरे पास कुछ कोड है जो टाइमर सेट करता है, लेकिन यदि उपयोगकर्ता उपयोग में होने पर टाइमर सेट करता है तो मुझे रनरबल को हटाने की आवश्यकता होती है जो टाइमर चलाती है और इसे फिर से शुरू करती है। लेकिन जब कोई हैंडलर कॉलबैक रननेबल मौजूद नहीं होता है और इस कोड को कॉल किया जाता है तो यह मेरे एप्लिकेशन को क्रैश करता है। इसलिए मुझे यह जांचने की ज़रूरत है कि कोई हैंडलर चल रहा है या नहीं, तो यदि इसे समाप्त करें और इसे पुनरारंभ करें, लेकिन दस्तावेज़ और अन्य स्टैक ओवरफ्लो प्रश्नों को देखकर, मैं नहीं देख सकता कि यह संभव है या नहीं।जांचें कि क्या एंड्रॉइड हैंडलर में कॉलबैक

submitTimer.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v) { 
      String s = timer.getText().toString(); 
      if(!s.equals("")) 
      { 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      Map.handler.removeCallbacks(Map.getRunnable()); 
      Map.runnable.run(); 
//I NEED TO CHECK A RUNNABLE HANDLER EXISTS AND IF SO THEN RUN THIS CODE, IF NOT IGNORE THIS CODE 
      int l = Integer.parseInt(s); 
      Map.timerinmins = l; 
      timer.setHint("Current Timer is "+Map.timerinmins); 
      timer.setText(""); 
      Toast.makeText(Preferences.this, "Timer is set!", Toast.LENGTH_SHORT).show(); 
      } 

      else 
      { 

       Toast.makeText(Preferences.this, "No value was entered", Toast.LENGTH_SHORT).show(); 
      } 
    } 

}); 

किसी को भी मदद कर सकते हैं मुझे संचालकों वर्तमान स्थिति की जाँच करने का एक तरीका यह पता लगाने:

यहाँ मेरी कोड, मैं कोड है जो केवल यदि कोई हैंडलर runnable मौजूद है निष्पादित किया जाना चाहिए चारों ओर टिप्पणी की है है?

उत्तर

4

यदि आप चाहते हैं कि आप पहली बार कॉलबैक डालते समय खाली संदेश भेज सकें और फिर उस संदेश को हैंडलर में जांचें। यह खाली संदेश प्रतिनिधित्व कर सकता है कि एक कॉलबैक मौजूद है। बाद में उस संदेश को हटाने के बाद भी यह देखने के लिए इस्तेमाल किया जा सकता था कि कॉलबैक अभी भी है या नहीं। इस तरह की एक प्रासंगिक स्थिति नहीं है, लेकिन यह सोचा कि मैं कम से कम एक संभावना की कोशिश करूँगा और साझा करूंगा।

... 
Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER); 
... 
if(Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) 
... 
Map.handler.removeMessage(CALLBACK_PRESENT_INTEGER); 
... 

यह शायद आदर्श नहीं है, लेकिन आप बिंदु जहां अपने कॉलबैक प्रयोग किया जाता है से अपने हैंडलर के लिए उपयोग किया है, तो एक संभावित समाधान हो सकता है। सुनिश्चित नहीं है कि पता लगाने का कोई सीधा तरीका है या नहीं।

3

Jay Snayder के जबाब का जिक्र करते हुए:

के बाद से ऐसे मामले हैं जो Map.handler.hasMessages(CALLBACK_PRESENT_INTEGER) रिटर्न झूठी भले ही में Map.handler.sendEmptyMessage(CALLBACK_PRESENT_INTEGER) कहा जाने लगा (भी, मुझे क्या हुआ है), यह एक बूलियन उपयोग करने के लिए है कि क्या यह निर्धारित करने के सुरक्षित हो सकता है कर रहे हैं हैंडलर के पास कॉलबैक है या नहीं।

... 

boolean callbackPresent = false; 

... 

if(!callbackPresent) { 

    // do what you have to do in case the handler doesn't have callbacks 

    // right before adding a callback to the handler, call: 
    callbackPresent = true; 

} else { 

    // do what you have to do in case the handler has callbacks 

    // right before removing the callbacks from the handler, call: 
    callbackPresent = false; 
} 

... 

मैं एक ऐप्स में इस समाधान का उपयोग कर रहा है और यह पूरी तरह से काम कर रहा है:
तो, कोड तर्क इस तरह बहुत ही सरल कुछ है।

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