Android使用AsyncTask下载图片,最好使用WeakReference
16lz
2022-04-06
参见:http://blog.chinaunix.net/space.php?uid=20787846&do=blog&cuid=2289102
http://winuxxan.blog.51cto.com/2779763/512179
有些人喜欢用Android提供的AsyncTask,但事实上AsyncTask的问题更加严重,Thread只有在run函数不结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题。
这种线程导致的内存泄露问题应该如何解决呢?
第一、将线程的内部类,改为静态内部类。
第二、在线程内部采用弱引用保存Context引用。
解决的模型如下:
- publicabstractclassWeakAsyncTask<Params,Progress,Result,WeakTarget>extends
- AsyncTask<Params,Progress,Result>{
- protectedWeakReference<WeakTarget>mTarget;
- publicWeakAsyncTask(WeakTargettarget){
- mTarget=newWeakReference<WeakTarget>(target);
- }
- /**{@inheritDoc}*/
- @Override
- protectedfinalvoidonPreExecute(){
- finalWeakTargettarget=mTarget.get();
- if(target!=null){
- this.onPreExecute(target);
- }
- }
- /**{@inheritDoc}*/
- @Override
- protectedfinalResultdoInBackground(Params...params){
- finalWeakTargettarget=mTarget.get();
- if(target!=null){
- returnthis.doInBackground(target,params);
- }else{
- returnnull;
- }
- }
- /**{@inheritDoc}*/
- @Override
- protectedfinalvoidonPostExecute(Resultresult){
- finalWeakTargettarget=mTarget.get();
- if(target!=null){
- this.onPostExecute(target,result);
- }
- }
- protectedvoidonPreExecute(WeakTargettarget){
- //Nodefaultaction
- }
- protectedabstractResultdoInBackground(WeakTargettarget,Params...params);
- protectedvoidonPostExecute(WeakTargettarget,Resultresult){
- //Nodefaultaction
- }
- }
更多相关文章
- Android中工作线程与主线程同步方式
- Android(安卓)关闭线程(转)
- Android中当前时间的动态显示
- android 获取camera状态?
- RxAndroid入门-传智播客
- Java(Android)线程池
- Android(安卓)多线程2
- Android、Java单例看这里(常用的单例模式对比)
- android 网络异步加载数据进度条