Yunying Zhang
Yunying Zhang
没错,这个并不算没有权限,需要android.permission.SYSTEM_ALERT_WINDOW 这个权限,否则也会闪退
- **问题原因:** 从网络上下载的图片会缓存到本地,在缓存设置中默认缓存格式是jpg,所以PNG图片会以jpg的格式缓存,也就失去了PNG的透明属性,出现PNG透明背景变黑或者其他不透明颜色。 - **解决办法:** 既然找到了问题的原因,就很容易解决了,缓存的设置中支持设置图片缓存的格式,可以通过对ImageCacheParams进行设置,设置缓存格式为PNG就可以了。如下: ImageCacheParams cacheParams = new ImageCacheParams(Config.COMPETITION_CACH_FOLDER); cacheParams.memCacheSize = 1024 \* 1024 \* Utils.getMemoryClass(mContext) / 3; cacheParams.compressFormat = Bitmap.CompressFormat.PNG; mImageWorker = new ImageFetcher(mContext, 0); mImageWorker.setLoadingImage(R.drawable.ic_team_default); mImageWorker.setImageFadeIn(false);...
- **问题原因:** 这个异常的原因是AsyncTask的问题,研究AsyncTask[(源码)](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java)的眼吗就会发现,其实AsyncTask是被限制在一个线程里的,无论你启动多少个AsynTask,都是在一个队列里面进行等待[(源码)](https://github.com/android/platform_frameworks_base/blob/master/core/java/android/os/AsyncTask.java#L192),有这么一行代码`private static final BlockingQueue sPoolWorkQueue = new LinkedBlockingQueue(10)`这也解释了为什么同一个AsynTask对象是无法两次excute了。Google进行了多次修改,经过源码分析和验证发现从1.6开始到3.0之前的系统版本当等待队列中的AsyncTask等待队列超过128个的时候,就会抛出RejectedExecutionException的异常,在这中间的办恩使用了线程池,允许运行多任务同时进行。而到了3.0之后,又被限制在一个线程里为了避免多线程执行的错误。 - **解决办法** 既然是AsyncTask的问题,可以从AsyncTask入手,自己重写一个AnsyTask相同功能的类,把启动的任务限制在一个线程里避免多线程执行的错误。本作者在网上找到一个已经写好的类[AsyncTaskEx](https://github.com/yinglovezhuzhu/BitmapLoader/tree/master/bitmaploader_library/src/main/java/com/opensource/bitmaploader/AsyncTaskEx.java),修改在特定的版本调用这个自定义的异步线程类。
> 有测试激活码吗 这项目没做成,服务器早废了,已经无法测试