最新消息:觉得本站不错的话 记得收藏哦 博客内某些功能仅供测试 讨论群:135931704 快养不起小站了 各位有闲钱就打赏下把 My Email weicots#gmail.com Please replace # with @

关于 Android SDK AsyncTask doInBackground 不运行 (子类) 的问题

Android Dev ajiang-tuzi 84浏览

最近拉团队做 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 不运行 (子类) 的问题