使用AsyncTask的常见问题及解决方式

原创 2015年11月19日 14:05:20

Configuration Changes(旋转屏幕是其中一种)时,会销毁并重建Activity,使用AsyncTask常出现的问题有,AsyncTask还在运行,但是屏幕一旋转,Activity销毁并重建,这样的话很可能导致崩溃。


解决方式一. 使用worker fragment
老外有篇博文介绍了这个的实现,我把它称为worker fragment
将AsyncTask放置于Fragment中,将Fragment放到Activity中,使用Fragment.setRetainInstance(),这样做的话,旋转屏幕Fragment是不会重建的。

解决方式二. 使用eventBus之类的库
这篇文章介绍了,这里就不多做解释。

解决方式三. 使用WeakReference来实现。
AsyncTask的子类设置为static,同时持有Activity的弱引用,大概代码如下
public class DemoActivity extends ActionBarActivity{
	MyTask mTask = null;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_demo);
		
		mTask = new MyTask(this);
		mTask.execute();
	}
	
	public void onMyTaskFinish(){
		mTask = null;
		
		// update UI
	}
	
	@Override
	protected void onDestroy() {
		if (mTask != null){
			mTask.cancel(true);
			mTask = null;
		}
		
		super.onDestroy();
	}
	
	static class MyTask extends AsyncTask<Void, Void, Void>{
		
		WeakReference<DemoActivity> mContextRef;
		public MyTask(DemoActivity context) {
			super();
			mContextRef = new WeakReference<DemoActivity>(context);
		}
		
		@Override
		protected Void doInBackground(Void... params) {
			// do some work
			return null;
		}
		@Override
		protected void onCancelled(Void result) {
			// TODO Auto-generated method stub
			super.onCancelled(result);
		}
		@Override
		protected void onPostExecute(Void result) {
			if (mContextRef != null && mContextRef.get() != null){
				DemoActivity context = mContextRef.get();
				if (context != null){
					context.onMyTaskFinish();
				}
			}
			  
			super.onPostExecute(result);
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

使用AsyncTask的常见问题及解决方式

Configuration Changes(旋转屏幕是其中一种)时,会销毁并重建Activity,使用AsyncTask常出现的问题有,AsyncTask还在运行,但是屏幕一旋转,Activity销...
  • jackson_ke
  • jackson_ke
  • 2015年11月19日 14:05
  • 303

android 使用asynctask结合fragment更新UI(另附线程池管理示例)

使用asynctask结合fragment更新UI。在android上有不少设计都是使用fragment,因为使用fragment的生命周期可以和activity一起管理,再受到横竖屏旋转也可以保持稳...
  • qq_16064871
  • qq_16064871
  • 2017年04月25日 22:36
  • 1548

Android常用异步请求AsyncTask的美中不足之处

相信很多的Android开发人员都很喜欢用到AsyncTask(请求服务器API),这种SDK封装好了的请求异步Task,使用起来很方便,但是也有它的不足之处。在开发Android应用的过程中,我们需...
  • u011730649
  • u011730649
  • 2015年02月25日 11:05
  • 2045

Android实现弱引用AsyncTask,将内存泄漏置之度外。

AsyncTask可谓是在Android中隐藏很深,曾经叱咤风云的功夫级人物。它的存在让网络和UI的通信变得异常简单和轻松。AsyncTask使用上的简单也得以让很多开发者青睐。一般情况下,Async...
  • u013718120
  • u013718120
  • 2016年11月04日 11:50
  • 2852

Android异步加载AsyncTask详解

最近项目发现个重大问题,结果打log跟踪查是AsyncTask导致的。如果对AsyncTask了解的不够深入透彻,那写代码就是埋雷。以后不定在哪个时间爆炸。首先我们要了解,谷歌为什么发明AsyncTa...
  • wdaming1986
  • wdaming1986
  • 2014年11月05日 20:03
  • 15073

使用AsyncTask异步任务下载数据

1.使用异步任务的原因: ①.android 4.0开始主线程不能执行耗时任务(网络连接,数据库访问,文件的读取)。 不能在主线程执行的原因: android的主线程也叫UI线程,专门响应用户的...
  • Carry_Code
  • Carry_Code
  • 2016年05月21日 17:01
  • 542

AsyncTask原理及不足

一:为什么需要工作者线程Android应用的主线程(UI线程)肩负着绘制用户界面和及时响应用户操作的重任,为了避免”ANR”,就要确保主线程时刻保持较高的响应性.为了做到这一点,我们就要把耗时的任务移...
  • Google_huchun
  • Google_huchun
  • 2017年03月24日 14:48
  • 1711

AsyncTask不为人知的那些事

作为java转android的一员,在入android之初,我通常使用thread+handler的方式处理异步线程后台等操作。后来接触了AsyncTask这个神奇的类,开始觉得很好用,后来才发现遇到...
  • juanq123
  • juanq123
  • 2015年12月16日 10:39
  • 689

Fragment,AsyncTaskLoader以及LoaderManager的一点体会

今天项目中涉及到了一个listview的功能:listview分段加载,下拉加载之前的数据,上拉加载之后的数据。 不是很麻烦的事情,所以我用到了开源库pulltorefresh,结合ListFrag...
  • u010069940
  • u010069940
  • 2014年01月20日 11:55
  • 1082

AsyncTask引发的一个问题:doInBackground()未及时执行

在公司实习时遇到一个很奇怪的问题,doInBackground()未及时执行,也就是它并没有在#execute()调用之后马上执行,而是等待了很久才得以执行。 查资料了解到:因为是4.0平台,所以所有...
  • A13428103432
  • A13428103432
  • 2015年09月06日 23:03
  • 1316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用AsyncTask的常见问题及解决方式
举报原因:
原因补充:

(最多只允许输入30个字)