मैं एंड्रॉइड पर विकास कर रहा हूं और मुझे पता नहीं लगा कि मेरे कुछ धागे "मॉनिटर" स्थिति में क्यों जा रहे हैं। मैंने पढ़ा है कि यह "सिंक्रनाइज़" समस्या के कारण हो सकता है लेकिन मुझे यकीन नहीं है कि कोई वस्तु उनके लॉक को कैसे जारी नहीं करेगी।थ्रेड स्थिति मॉनीटर। मैं इसे कैसे डीबग करूं? इसका क्या कारण है?
क्या कोई इसे डिबग करने में मदद कर सकता है या आप कुछ भी कर रहे हैं जो मैं गलत कर रहा हूं? क्या यह सिंक्रनाइज़ किए गए ऑब्जेक्ट्स का मुद्दा जारी नहीं किया जा रहा है या क्या मेरा लोडिंग ठीक से समय समाप्त नहीं कर रहा है और सभी धागे को लॉक कर रहा है?
यहाँ मैं कैसे सिंक्रनाइज़ का उपयोग कर रहा है।
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);
}
}
क्या कोई वास्तविक समस्या होती है (उदा। डेडलॉक) या कोड ठीक चलाता है? – Tudor
थ्रेड स्थिति नहीं है जो "मॉनिटर" होने के कारण लाल रंग में घूमती है? – user123321
मेरा मतलब था कि एप्लिकेशन को चलाने पर आपको वास्तव में डेडलॉक मिल रहा है (डिबगिंग के बिना)? – Tudor