2016-10-17 3 views
10

इसी प्रकार के प्रश्न asked herecode that gave from this error किया गया है, here और here लेकिन संदर्भ इस से काफी अलग है और इसके अलावा एंड्रॉइड और एंड्रॉइड स्टूडियो के निर्माताओं द्वारा लिखा गया है।"चेतावनी: स्थिर क्षेत्रों में एंड्रॉयड संदर्भ कक्षाएं न रखें, यह एक स्मृति रिसाव (टूट जाता है त्वरित रन है और यह भी) कि"

public class MySingleton { 
    private static MySingleton mInstance; 
    private RequestQueue mRequestQueue; 
    private ImageLoader mImageLoader; 
    private static Context mCtx; 

    private MySingleton(Context context) { 
     mCtx = context; 
     mRequestQueue = getRequestQueue(); 

     mImageLoader = new ImageLoader(mRequestQueue, 
       new ImageLoader.ImageCache() { 
      private final LruCache<String, Bitmap> 
        cache = new LruCache<String, Bitmap>(20); 

      @Override 
      public Bitmap getBitmap(String url) { 
       return cache.get(url); 
      } 

      @Override 
      public void putBitmap(String url, Bitmap bitmap) { 
       cache.put(url, bitmap); 
      } 
     }); 
    } 

    public static synchronized MySingleton getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new MySingleton(context); 
     } 
     return mInstance; 
    } 

    public RequestQueue getRequestQueue() { 
     if (mRequestQueue == null) { 
      // getApplicationContext() is key, it keeps you from leaking the 
      // Activity or BroadcastReceiver if someone passes one in. 
      mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); 
     } 
     return mRequestQueue; 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     getRequestQueue().add(req); 
    } 

    public ImageLoader getImageLoader() { 
     return mImageLoader; 
    } 
} 

लाइनों चेतावनी दे रहे हैं:

इस कोड है

private static MySingleton mInstance; 
private static Context mCtx; 

अब अगर मैं, static कीवर्ड को निकालने के public static synchronized MySingleton getInstance(Context...public synchronized MySingleton getInstance(Context... करने के लिए त्रुटि disappers बदल लेकिन एक और समस्या आ जाती है ।

मैं रीसाइक्लिंग व्यू में MySingleton का उपयोग करता हूं। तो इस लाइन

@Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { ImageLoader imageLoader = MySingleton.getInstance(mContext).getImageLoader();

मुझे

गैर स्थिर विधि 'getInstance (android.content.Context)' एक स्थिर संदर्भ से refrenced नहीं किया जा सकता बताता है।

कृपया किसी को भी इसे ठीक करने जानता है?

+3

यह आपके द्वारा लिंक किए गए अन्य प्रश्नों से अलग कैसे है? – nhouser9

+0

कोड एंट यह एप्लिकेशन – X09

+0

https://stackoverflow.com/questions/39840818/android-googles-contradiction-on-singleton-pattern/39841446#39841446 – CommonsWare

उत्तर

11

मैं answer to a similar question answered by CommonsWare

में इस का हल मिल गया मैं

बोली उद्धृत एक प्रकार का वृक्ष चेतावनी एकमात्र बनाने के बारे में शिकायत नहीं कर रहा है। यह मनमानी संदर्भ के संदर्भ में सिंगलटन बनाने के बारे में शिकायत कर रहा है, क्योंकि यह गतिविधि की तरह कुछ हो सकता है। उम्मीद है, mContext = context.getApplicationContext() के लिए mContext = संदर्भ बदलकर, तो आप उस चेतावनी से छुटकारा मिल जाएगा (हालांकि यह संभव है कि यह अब भी तत्काल भागो टूट जाता है - मैं वास्तव में उस पर नहीं टिप्पणी कर सकते हैं)।

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

तो गूगल वास्तव में ही करार नहीं है। इसे ठीक करने के लिए, यदि this.getApplicationContext संदर्भ के लिए पैरामीटर के रूप में आपूर्ति की जाती है, तो कोई स्मृति रिसाव नहीं होगी।

तो संक्षेप में, चेतावनी को अनदेखा और संदर्भ के लिए एक पैरामीटर के रूप this.getApplicationContext की आपूर्ति।

+4

मेरे पास पहले से ही 'mContext = context.getAplicationContext() 'चेतावनी अभी भी है! – Max

+0

कृपया आप पूरा कोड दिखा सकते हैं? यदि मैं कोड देख सकता हूं तो मैं आपकी मदद करने के लिए एक बेहतर स्थिति में रहूंगा। – X09

+1

मैं पुष्टि कर सकता हूं, यह लिंट चेतावनी को नहीं हटाता है। मुझे नहीं लगता कि प्राप्त करने के लिए संदर्भ बदलना एप्प्लिकेशन कॉन्टेक्स्ट काम करेगा क्योंकि यह अभी भी संदर्भ प्रकार का ऑब्जेक्ट लौटा रहा है। – Pellet

4

मैंने इसे ऐपकंट्रोलर में डालने का अंत किया जिसमें कोई चेतावनी नहीं है।

public class AppController extends MultiDexApplication { 

    public static Context getContext() { 
     return mInstance.getApplicationContext(); 
    } 

    private static AppController mInstance; 

    public static synchronized AppController getInstance() { 
     return mInstance; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     mInstance = this; 

    } 
} 

तो जब भी आप इसकी आवश्यकता है तो बस फोन AppController.getContext()

+0

यह मेरे मामले में एक ही त्रुटि की ओर जाता है। 'mInstance' अब समस्याग्रस्त क्षेत्र है। और आपको 'getInstance() 'की आवश्यकता क्यों है? – SapuSeven

+0

mnstance कस्टम दृश्यों के साथ xml लेआउट में डिज़ाइन समय में शून्य है, मुझे पता है कि यह किसी भी तरह से दुर्लभ है, लेकिन मैंने कस्टम दृश्यों के साथ कुछ XML में पूर्वावलोकन खो दिया :( – do01

-1

यह मेरा समाधान था। जब आप RequestQueue का उदाहरण वापस कर रहे हों तो स्थिर संदर्भ रखने की आवश्यकता नहीं है?

public class VolleyRequestQueue { 

    private static VolleyRequestQueue mInstance; 
    private RequestQueue mRequestQueue; 

    private VolleyRequestQueue() { 

    } 

    public static synchronized VolleyRequestQueue getInstance() { 
     if(mInstance == null) { 
      mInstance = new VolleyRequestQueue(); 
     } 
     return mInstance; 
    } 

    public RequestQueue getRequestQueue(Context context) { 
     if(mRequestQueue == null) { 
      mRequestQueue = Volley.newRequestQueue(context.getApplicationContext()); 
     } 
     return mRequestQueue; 
    } 
} 
-1

मैंने इस सिंगलटन कक्षा को लिखा और कोई स्मृति रिसाव या अन्य चेतावनी नहीं मिली।

public class UtilSharedPrefernce { 

public class UtilSharedPrefernce { 

    private static UtilSharedPrefernce mInstance; 
    private SharedPreferences mMyPreferences; 

    private UtilSharedPrefernce(){ } 

    public static UtilSharedPrefernce getInstance(){ 
     if (mInstance == null) 
      mInstance = new UtilSharedPrefernce(); 
     return mInstance; 
    } 

    public void Initialize(Context ctxt){ 
     mMyPreferences = PreferenceManager.getDefaultSharedPreferences(ctxt); 
    } 

    public void writePreference(String key, String value){ 
     SharedPreferences.Editor e = mMyPreferences.edit(); 
     e.putString(key, value); 
     e.apply(); 
    } 

    public String readPreference(String key){ 
     return mMyPreferences.getString(key, ""); 

    } 

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