2012-08-24 15 views
5

मैं एंड्रॉइड पर विकास कर रहा हूं और मुझे पता नहीं लगा कि मेरे कुछ धागे "मॉनिटर" स्थिति में क्यों जा रहे हैं। मैंने पढ़ा है कि यह "सिंक्रनाइज़" समस्या के कारण हो सकता है लेकिन मुझे यकीन नहीं है कि कोई वस्तु उनके लॉक को कैसे जारी नहीं करेगी।थ्रेड स्थिति मॉनीटर। मैं इसे कैसे डीबग करूं? इसका क्या कारण है?

क्या कोई इसे डिबग करने में मदद कर सकता है या आप कुछ भी कर रहे हैं जो मैं गलत कर रहा हूं? क्या यह सिंक्रनाइज़ किए गए ऑब्जेक्ट्स का मुद्दा जारी नहीं किया जा रहा है या क्या मेरा लोडिंग ठीक से समय समाप्त नहीं कर रहा है और सभी धागे को लॉक कर रहा है?

enter image description here

यहाँ मैं कैसे सिंक्रनाइज़ का उपयोग कर रहा है।

private Bitmap getFromSyncCache(String url) { 
    if (syncCache == null) return null; 
    synchronized (syncCache) { 
     if (syncCache.hasObject(url)) { 
      return syncCache.get(url); 
     } else { 
      return null; 
     } 
    } 
} 

और यहाँ:

bitmapLoader.setOnCompleteListener(new BitmapLoader.OnCompleteListener() { 
      @Override 
      public void onComplete(Bitmap bitmap) { 
       if (syncCache != null) { 
        synchronized (syncCache) { 
         syncCache.put(bitmapLoader.getLoadUrl(), bitmap); 
        } 
       } 
       if (asyncCache != null) addToAsyncCache(bitmapLoader.getLoadUrl(), bitmap); 
       if (onCompleteListener != null) onCompleteListener.onComplete(bitmap); 
      } 
     }); 

और यहाँ अपने कैश

public class MemoryCache<T> implements Cache<T>{ 

private HashMap<String, SoftReference<T>> cache; 

public MemoryCache() { 
    cache = new HashMap<String, SoftReference<T>>(); 
} 

@Override 
public T get(String id) { 
    if(!cache.containsKey(id)) return null; 
    SoftReference<T> ref = cache.get(id); 
    return ref.get(); 
} 

@Override 
public void put(String id, T object) { 
    cache.put(id, new SoftReference<T>(object)); 
} 

@Override 
public void clearCache() { 
    cache.clear(); 
} 

@Override 
public boolean hasObject(String id) { 
    return cache.containsKey(id); 
} 

है और यह कैसे मैं वेब से छवि लोड कर रहा हूँ है:

private void threadedLoad(String url) { 
    cancel(); 
    bytesLoaded = 0; 
    bytesTotal = 0; 
    try { 
     state = State.DOWNLOADING; 
     conn = (HttpURLConnection) new URL(url).openConnection(); 
     bytesTotal = conn.getContentLength(); 

     // if we don't have a total can't track the progress 
     if (bytesTotal > 0 && onProgressListener != null) { 
      // unused    
     } else { 
      conn.connect(); 
      inStream = conn.getInputStream(); 
      Bitmap bitmap = BitmapFactory.decodeStream(inStream); 
      state = State.COMPLETE; 
      if (state != State.CANCELED) { 
       if (bitmap != null) { 
        msgSendComplete(bitmap); 
       } else { 
        handleIOException(new IOException("Skia could not decode the bitmap and returned null. Url: " + loadUrl)); 
       } 
      } 
      try { 
       inStream.close(); 
      } catch(Exception e) { 

      } 
     } 
    } catch (IOException e) { 
     handleIOException(e); 
    } 
} 
+0

क्या कोई वास्तविक समस्या होती है (उदा। डेडलॉक) या कोड ठीक चलाता है? – Tudor

+0

थ्रेड स्थिति नहीं है जो "मॉनिटर" होने के कारण लाल रंग में घूमती है? – user123321

+0

मेरा मतलब था कि एप्लिकेशन को चलाने पर आपको वास्तव में डेडलॉक मिल रहा है (डिबगिंग के बिना)? – Tudor

उत्तर

1

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

enter image description here

जब मैं अपने गतिरोध डिबगिंग किया गया था, दोनों धागे सिंक्रनाइज़ बयान पर इंतज़ार कर निकला।