java中HandleQuery监视器_java – 线程状态监视器.我该如何调试?是什么造成的?...

在Android开发中,遇到线程进入'监视'状态的问题,可能由同步(synchronized)块不当使用引起。文章讨论了如何调试这个问题,并分析了可能导致线程被锁定的原因,包括同步对象未正确释放锁的情况。通过检查`getFromSyncCache`和`onCompleteListener`中`synchronized`关键字的使用,以及`MemoryCache`类的实现,提出了解决和避免线程挂起的策略。
摘要由CSDN通过智能技术生成

我正在开发

Android,我无法弄清楚为什么我的一些线程会进入“监视”状态.我读过它可能是因为“同步”问题,但我不确定对象如何不释放它们的锁.

任何人都可以帮助如何调试这个或你看到我做错了什么?这是同步对象没有被释放的问题,还是我的加载没有正确地超时并锁定所有线程?

这是我使用synchronized的方式.

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 implements Cache{

private HashMap> cache;

public MemoryCache() {

cache = new HashMap>();

}

@Override

public T get(String id) {

if(!cache.containsKey(id)) return null;

SoftReference ref = cache.get(id);

return ref.get();

}

@Override

public void put(String id, T object) {

cache.put(id, new SoftReference(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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值