我想问一下 各位大神 那个发送下载进度给activity mfinished是单个线程的完成度吧 应该是传过去所有线程的已经下载的进度吧 不解啊 这里
2017-05-15
接上一条评论:
当第一个线程执行到行1,已进入if内,但还没有执行行2时,即sHelper依然为null,此时系统如果切换到第二个线程执行,第二个线程依然能进入if内,然后new一个并返回一个sHelper实例(假设内存地址为0x000012)。然后系统切换回线程1,继续在if内向下执行,此时它也会new一个实例(假设内存地址为0x000023)并返回。这样的话,各线程拿到的实例是不同的,在写数据库时依然会发生加锁情况。
给方法加同步,或用双重检测可解决,不了解的同学建议看看单例模式的七种写法(亦有说八种)及它们各自的优缺点。
当第一个线程执行到行1,已进入if内,但还没有执行行2时,即sHelper依然为null,此时系统如果切换到第二个线程执行,第二个线程依然能进入if内,然后new一个并返回一个sHelper实例(假设内存地址为0x000012)。然后系统切换回线程1,继续在if内向下执行,此时它也会new一个实例(假设内存地址为0x000023)并返回。这样的话,各线程拿到的实例是不同的,在写数据库时依然会发生加锁情况。
给方法加同步,或用双重检测可解决,不了解的同学建议看看单例模式的七种写法(亦有说八种)及它们各自的优缺点。
2017-05-07
提醒下后来的同学:
视频中的单例模式是不安全的,不能保证只产生单例。
if(sHelper==null){ // 行1
sHelper = new DatabaseHelper(context); //行2
}
return sHelper; // 行3
视频中的单例模式是不安全的,不能保证只产生单例。
if(sHelper==null){ // 行1
sHelper = new DatabaseHelper(context); //行2
}
return sHelper; // 行3
2017-05-07
已采纳回答 / 小鹏不小
咳咳咳 这个可以看做是一个静态内部类,它呢不会持有外部类的应用 老师这里应该只是为了方便而已...在开发时,提倡使用内部类提倡这种...比如Handler 这样不会造成内存泄漏
2017-04-25
那个getAllThread查询没问题是因为在任务开始之前执行,不涉及多线程,不过那个isExists是在任务开始后执行的,会出现查询时Cursor被其他线程关闭的问题
2017-03-16
最新回答 / 慕粉0946147077
再次下载下载进度不对,可能是数据库里面的数据不对了,应为下载进度每次都是从数据库里面获取的,所以检查一下数据库读写操作这个流程看看是哪个步骤出问题了
2016-12-24
最赞回答 / 天道酬勤_life
将InputStream换成BufferedInputStream,初始化bis=new BufferedInputStream(connection.getInputStream()); 其余的不变
2016-12-08