दिलचस्प पोस्ट
जावास्क्रिप्ट में स्ट्रिंग लंबाई बाइट्स में प्रक्रिया। प्रारंभ: आउटपुट कैसे प्राप्त करें? जावा में नियमित अभिव्यक्ति के लिए टेक्स्ट से कैसे बचें आप सी में एक फ़ाइल के आकार का निर्धारण कैसे करते हैं? क्या $ (दस्तावेज़) .ready () भी सीएसएस तैयार है? क्या SQL सर्वर MySQL पर डुप्लिकेट की कुंजी अद्यतन की तरह कुछ भी ऑफर करता है एक्सप्रेस में एकाधिक फ़ाइलों में रूट हैंडलर को कैसे शामिल करें? पायथन क्लास डेकोरेटर ऑटोसाइज़िंग मास्क प्रोग्रामैटिक बनाम इंटरफ़ेस बिल्डर / xib / nib Chart.js पर डेटा वैल्यू कैसे प्रदर्शित करें जीडीबी का उपयोग कैसे करें डीबग करने के लिए? Javascript ऑब्जेक्ट के दो सरणियों की तुलना करने के लिए jQuery का उपयोग करना तालिका पंक्ति गणना प्राप्त करने का सबसे कारगर तरीका अनुप्रयोग की निर्देशिका को एक WPF अनुप्रयोग से प्राप्त करना वर्ड फ़ाइल .doc, docx, .xlsx, .pptx php से पाठ निकालने का तरीका

डायलॉग फेंक करने के लिए "getApplication () के साथ संदर्भ के रूप में खिड़की – टोकन नल जोड़ने में असमर्थ कोई अनुप्रयोग के लिए नहीं है"

मेरी गतिविधि एक अलर्ट डाइलॉग बनाने की कोशिश कर रही है जिसके लिए पैरामीटर के रूप में एक संदर्भ की आवश्यकता है यह काम करता है जैसा मैं उम्मीद करता हूं:

AlertDialog.Builder builder = new AlertDialog.Builder(this); 

हालांकि, मैं स्मृति लीक की संभावना के कारण एक संदर्भ के रूप में "यह" का उपयोग करने का लकीर हूँ जब गतिविधि नष्ट हो जाती है और स्क्रीन रोटेशन की तरह कुछ सरल होने के दौरान भी इसे बनाया जाता है। एंड्रॉइड डेवलपर के ब्लॉग पर संबंधित पोस्ट से :

संदर्भ-संबंधित स्मृति लीक से बचने के दो आसान तरीके हैं सबसे स्पष्ट रूप से अपने स्वयं के दायरे के बाहर संदर्भ से बचने से बचने के लिए है ऊपर दिए गए उदाहरण में एक स्थिर संदर्भ के मामले को दिखाया गया है लेकिन आंतरिक कक्षाएं और बाह्य वर्ग के उनके अंतर्निहित संदर्भ समान रूप से खतरनाक हो सकते हैं। दूसरा समाधान अनुप्रयोग संदर्भ का उपयोग करना है। यह संदर्भ तब तक जीवित रहेगा जब तक आपका आवेदन जीवित नहीं है और यह जीवन चक्र के कार्यकलापों पर निर्भर नहीं करता है। यदि आप दीर्घकालिक वस्तुओं को रखने की योजना बनाते हैं जो किसी संदर्भ की आवश्यकता होती है, तो एप्लिकेशन ऑब्जेक्ट को याद रखें। आप Context.getApplicationContext () या Activity.getApplication () को कॉल कर आसानी से प्राप्त कर सकते हैं।

लेकिन AlertDialog() न ही getApplicationContext() या getApplication() एक संदर्भ के रूप में स्वीकार्य है, क्योंकि यह अपवाद फेंकता है:

"विंडो जोड़ने के लिए असमर्थ टोकन किसी अनुप्रयोग के लिए नहीं है"

प्रति संदर्भ: 1 , 2 , 3 , आदि

इसलिए, क्या यह वास्तव में एक "बग" माना जाना चाहिए, क्योंकि हमें आधिकारिक तौर पर Activity.getApplication() का उपयोग करने की सलाह दी जाती है। Activity.getApplication() और फिर भी यह विज्ञापन के रूप में काम नहीं करता है?

जिम

वेब के समाधान से एकत्रित समाधान "डायलॉग फेंक करने के लिए "getApplication () के साथ संदर्भ के रूप में खिड़की – टोकन नल जोड़ने में असमर्थ कोई अनुप्रयोग के लिए नहीं है""

getApplicationContext() बजाय, केवल ActivityName.this उपयोग करें।

इसका उपयोग करने के लिए मेरे लिए काम नहीं किया, लेकिन MyActivityName.this । उम्मीद है कि यह किसी को भी this काम करने के लिए नहीं मिल सकता है में मदद करता है।

आप getApplicationContext() का उपयोग जारी रख सकते हैं, लेकिन उपयोग करने से पहले, आपको यह झंडा जोड़ना चाहिए: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) , और त्रुटि नहीं दिखाएगी।

अपने मैनिफेस्ट में निम्नलिखित अनुमति जोड़ें:

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 

आपका संवाद "लंबे समय तक चलने वाला ऑब्जेक्ट नहीं होना चाहिए, जिसे संदर्भ की जरूरत है" प्रलेखन भ्रामक है मूल रूप से यदि आप ऐसा कुछ करते हैं:

 static Dialog sDialog; 

( स्थिर नोट करें)

फिर कहीं एक गतिविधि में आपने किया

  sDialog = new Dialog(this); 

आप संभवतः रोटेशन के दौरान मूल गतिविधि को लीक कर सकते हैं या इसी तरह की गतिविधि को नष्ट कर सकते हैं। (जब तक आप डायरेरॉय में साफ नहीं करते हैं, लेकिन उस स्थिति में आप शायद डायलॉग ऑब्जेक्ट स्थिर नहीं बनाते हैं)

कुछ डेटा संरचनाओं के लिए यह उन्हें स्थैतिक बनाने और अनुप्रयोग के संदर्भ को बंद करने के लिए समझने में सक्षम होगा, लेकिन आम तौर पर UI संबंधित चीजों के लिए नहीं, जैसे संवाद। तो ऐसा कुछ:

 Dialog mDialog; ... mDialog = new Dialog(this); 

ठीक है और गतिविधि को रिसाव नहीं करना चाहिए क्योंकि एमडीआईअलोग गतिविधि से मुक्त हो जाएगा क्योंकि यह स्थिर नहीं है।

आप किसी ऐसे प्रसंग के माध्यम से एक अनुप्रयोग window/dialog प्रदर्शित नहीं कर सकते जो एक गतिविधि या सेवा नहीं हैवैध गतिविधि संदर्भ पार करने का प्रयास करें

मुझे अपने संदर्भ को किसी कस्टम एडाप्टर पर एक कंट्रोलर के माध्यम से एक टुकड़ा में प्रदर्शित किया गया था और इसे GetApplicationContext () के साथ मिला था। मैंने इसके साथ हल किया:

this.getActivity().getWindow().getContext() टुकड़ों में ' onCreate कॉलबैक।

एक डायलॉग बॉक्स दिखाए जाने के बटन पर क्लिक करते हुए Activity

 Dialog dialog = new Dialog(MyActivity.this); 

मेरे लिए काम किया

जब आपने कहा था कि "अलर्टडायलोग के लिए () न हो तो getApplicationContext () या getApplication () एक संदर्भ के रूप में स्वीकार्य है, जैसा कि यह अपवाद फेंकता है: 'विंडो को जोड़ने में असमर्थ टोकन रिक्त एक आवेदन पत्र'"

एक डायलॉग बनाने के लिए, आपको किसी गतिविधि संदर्भ या सेवा संदर्भ की आवश्यकता है , न कि एक अनुप्रयोग प्रसंग (दोनों getApplicationContext () और getApplication () एक अनुप्रयोग संदर्भ वापस)।

यहां बताया गया है कि आप गतिविधि संदर्भ कैसे प्राप्त करते हैं:

(1) किसी गतिविधि या सेवा में:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

(2) एक टुकड़ा में: AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

मेमोरी लीक एक ऐसा समस्या नहीं है जो "यह" संदर्भ के लिए आंतरिक है, जो ऑब्जेक्ट का खुद का संदर्भ है (अर्थात ऑब्जेक्ट के डेटा को संग्रहीत करने के लिए वास्तविक आवंटित मेमोरी के संदर्भ)। ऐसा आवंटित स्मृति के लिए होता है जिसके लिए कचरा कलेक्टर (जीसी) को आवंटित स्मृति के बाद से मुक्त करने में असमर्थ है, इसके उपयोगी जीवन काल से निकल चुका है।

ज्यादातर समय, जब एक चर का दायरा खत्म हो जाता है, तो जीसी द्वारा स्मृति को पुनः प्राप्त किया जाएगा। हालांकि, मेमोरी लीक तब हो सकते हैं जब एक वस्तु के संदर्भ में "एक्स" कहते हैं, तब भी जारी रहती है जब ऑब्जेक्ट ने अपनी उपयोगी जीवनकाल खत्म कर दिया हो। इसलिए आवंटित मेमोरी तब तक खो जाएंगे जब तक "x" इसका एक संदर्भ रखता है क्योंकि जीसी स्मृति को तब तक खाली नहीं कर सकती जब तक कि मेमोरी अभी भी संदर्भित नहीं हो रही है। आवंटित मेमोरी के संदर्भों की एक श्रृंखला के कारण कभी-कभी मेमोरी लीक स्पष्ट नहीं होते हैं ऐसी स्थिति में, जीसी स्मृति को तब तक खाली नहीं कर देगी जब तक उस मेमोरी के सभी संदर्भ हटा दिए जाएं।

मेमोरी लीक को रोकने के लिए, तार्किक त्रुटियों के लिए अपना कोड जांचें, जो आवंटित स्मृति को "यह" (या अन्य संदर्भ) से अनिर्दिष्ट रूप से संदर्भित करने का कारण बनता है। चेन रेफ़रेंस के लिए भी जांचना याद रखें यहां कुछ उपकरण हैं जिनका उपयोग आप स्मृति उपयोग का विश्लेषण करने और उन दुर्भावनापूर्ण स्मृति लीक को ढूंढने में मदद करने के लिए कर सकते हैं:

  • जेआरोकिट मिशन कंट्रोल

  • JProbe

  • YourKit

  • AD4J

लिटिल हैक: आप जीसी द्वारा गतिविधि को नष्ट करने से रोक सकते हैं (बेशक, आपको ऐसा नहीं करना चाहिए, लेकिन यह कुछ स्थितियों में मदद कर सकता है):

 public class PostActivity extends Activity { ... private Context contextForDialog = null; ... public void onCreate(Bundle savedInstanceState) { ... contextForDialog = this; } ... private void showAnimatedDialog() { mSpinner = new Dialog(contextForDialog); mSpinner.setContentView(new MySpinner(contextForDialog)); mSpinner.show(); } ... } 

यदि आप किसी टुकड़े का उपयोग कर रहे हैं और AlertDialog / Toast संदेश का उपयोग कर रहे हैं तो संदर्भ पैरामीटर में getActivity () का उपयोग करें।

इस तरह

 ProgressDialog pdialog; pdialog = new ProgressDialog(getActivity()); pdialog.setCancelable(true); pdialog.setMessage("Loading ...."); pdialog.show(); 

जोड़ने

 dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 

तथा

मैनिफेस्ट में "android.permission.SYSTEM_ALERT_WINDOW"/>

यह मेरे लिए अब काम करता है आवेदन बंद करने और खोलने के बाद, उस समय मुझे त्रुटि दी।

मैं एक टुकड़ा में ProgressDialog getActivity().getApplicationContext() का उपयोग कर रहा था और मिल रहा है getActivity().getApplicationContext() प्राप्त करने पर यह त्रुटि हो रही है getActivity().getApplicationContext() निर्माता पैरामीटर के रूप में। getActivity().getBaseContext() को बदलने के लिए getActivity().getBaseContext() या तो काम नहीं किया।

मेरे लिए काम करने वाला समाधान getActivity() पास करना था; अर्थात

progressDialog = new ProgressDialog(getActivity());

MyDialog md = new MyDialog(MyActivity.this.getParent()); उपयोग करें MyDialog md = new MyDialog(MyActivity.this.getParent());

यदि आप गतिविधि के बाहर हैं तो आपको अपने कार्य में "NameOfMyActivity.This" गतिविधि गतिविधि के रूप में उपयोग करने की आवश्यकता है, उदाहरण:

 public static void showDialog(Activity activity) { AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setMessage("Your Message") .setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener).show(); } //Outside your Activity showDialog(NameOfMyActivity.this); 

यदि आप एक टुकड़ा का उपयोग कर रहे हैं और एक AlertDialog / Toast संदेश का उपयोग कर रहे हैं, संदर्भ पैरामीटर में getActivity() उपयोग करें

मेरे लिए काम किया

चीयर्स!

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

Forexample, यदि आपके पास दो टैब के साथ होस्ट के रूप में टैबएक्टिवटी है, और प्रत्येक टैब एक और गतिविधि है, और यदि आप किसी टैब (गतिविधियों) से संवाद बनाने का प्रयास करते हैं और यदि आप "यह" प्रयोग करते हैं, तो आपको अपवाद मिलेगा, इसमें केस संवाद को होस्ट गतिविधि से जोड़ा जाना चाहिए जो कि सब कुछ और दृश्यमान होस्ट करता है। (आप कह सकते हैं सबसे अधिक दिखने वाली अभिभावक गतिविधि का संदर्भ)

मुझे यह जानकारी किसी भी दस्तावेज़ से नहीं मिली, लेकिन कोशिश कर रही है मजबूत पृष्ठभूमि के बिना यह मेरा समाधान है, अगर कोई बेहतर ज्ञात है, तो टिप्पणी करने में संकोच न करें।

मेरे मामले में काम करते हैं:

 this.getContext(); 

GetParent () को नए AlertDialog.Builder (getParent ()) जैसे संदर्भ के तर्क बिंदु पर आज़माएं; आशा है कि यह काम करेगा, यह मेरे लिए काम किया

मुझे लगता है कि ऐसा हो सकता है कि आप एक धागा से एक संवाद दिखाने का प्रयास कर रहे हैं जो कि मुख्य UI थ्रेड नहीं है।

उस स्थिति में runOnUiThread () का उपयोग करें

या किसी अन्य संभावना का पालन करने के लिए डायलॉग बनाना है:

 final Dialog dialog = new Dialog(new ContextThemeWrapper( this, R.style.MyThemeDialog)); 

भावी पाठकों के लिए, यह मदद करनी चाहिए:

 public void show() { if(mContext instanceof Activity) { Activity activity = (Activity) mContext; if (!activity.isFinishing() && !activity.isDestroyed()) { dialog.show(); } } } 

एपीआई पर एक नज़र डालने के बाद, आप संवाद को अपनी गतिविधि या getActivity को पारित कर सकते हैं यदि आप किसी टुकड़े में हैं, तो इसे ज़ोर-ज़्यादा dialog.ismiss () के साथ इसे लीक से रोकने के लिए वापसी के तरीकों से साफ़ करें।

यद्यपि यह स्पष्ट रूप से कहीं भी नहीं बताया गया है, ऐसा लगता है कि आपको ऑनक्लिक हंडलर्स में संवाद को वापस करने के लिए ही ऐसा किया गया है।