最近拉团队做 CRM 的配套项目APP 时发现 Android SDK AsyncTask doInBackground 不运行的问题 特的记录
原代码
if (mTcpClient != null) { new SendMessageTask().execute(message); Log.e("send -8", message); }
更改后的代码
if (mTcpClient != null) { if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){ // new SendMessageTask().execute(message); new SendMessageTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,message); } else{ new SendMessageTask().execute(message); } Log.e("send -8", message); }
原因说明
AsyncTask()的行为。execute();已通过Android版本更改。在Donut之前(Android:1.6 API:4)任务顺序执行
从Donut到Gingerbread(Android:2.3 API:9)任务并行执行;
因为Honeycomb(Android:3.0 API:11)执行切换回顺序;一个新的方法AsyncTask()。executeOnExecutor(Executor)但是,被添加为并行执行。
在顺序处理中,所有Async任务在单个线程中运行,因此必须在上一个任务结束之前等待。如果需要立即执行代码,则需要在单独的线程中并行处理任务。
使用AsyncTask的串行执行在甜甜圈和蜂窝版本之间不可用,而并行执行在甜甜圈之前不可用。
对于Donut之后的并行处理:检查Build版本,并基于使用.execute()或.executeOnExecutor()方法。以下代码可以帮助…
AsyncTask<Void,Void,Void> myTask = new AsyncTask<Void,Void,Void>() { ... }; // ... your AsyncTask code goes here if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); else myTask.execute();
注意:函数.executeOnExecutor()检查项目的targetSdkVersion是否小于或等于HONEYCOMB_MR1(Android:2.1 API:7),那么它强制执行器是THREAD_POOL_EXECUTOR(在蜂窝中顺序运行任务)。
如果你没有定义targetSdkVersion,则minSdkVersion被自动认为是targetSdkVersion。
因此,为了在Post Honeycomb上并行运行AsyncTask,您不能将targetSdkVersion留空。
编辑:Android支持库现在包括帮助类AsyncTaskCompat,它可以处理API的变化,使你的代码更小/更简单。
这里是语法…
AsyncTask<Void,Void,Void> myAsyncTask = new AsyncTask<Void,Void,Void>() { ... }; // ... your AsyncTask AsyncTaskCompat.executeParallel( myAsyncTask, Params );
其中myAsyncTask是您定义的任务,或者您可以在此处的语句中执行新的AsyncTask(),Params是要发送到AsyncTask的参数,或者您可以发送null。
转载请注明:(●--●) Hello.My Weicot » 关于 Android SDK AsyncTask doInBackground 不运行 (子类) 的问题