Android 异步任务;调用方法onPreExecute()后未调用doInbackground()

Android 异步任务;调用方法onPreExecute()后未调用doInbackground(),android,android-asynctask,Android,Android Asynctask,我确实在我的项目中添加了异步库,并且已经检查过了,我不知道为什么代码流没有进入异步任务 代码 public-void-doMysql() { Log.v(“doMysql”,“已访问”); 新建异步任务(){ @凌驾 受保护的void onPreExecute(){ super.onPreExecute(); Log.e(“AsyncTask”、“onPreExecute”); } @凌驾 受保护字符串doInBackground(无效…参数){ Log.v(“AsyncTask”、“doInB

我确实在我的项目中添加了异步库,并且已经检查过了,我不知道为什么代码流没有进入异步任务

代码

public-void-doMysql()
{
Log.v(“doMysql”,“已访问”);
新建异步任务(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.e(“AsyncTask”、“onPreExecute”);
}
@凌驾
受保护字符串doInBackground(无效…参数){
Log.v(“AsyncTask”、“doInBackground”);
字符串msg=“”;
DefaultHttpClient httpclient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://172.16.100.172:52273/mysql");
ArrayList nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“myday”,Integer.toString(day\u picker.getYear())+
addZero(day_picker.getMonth()+1)+
addZero(day\u picker.getDayOfMonth());
添加(新的BasicNameValuePair(“mystar”,changeStar(day\u picker.getMonth()+1,day\u picker.getDayOfMonth()));
添加(新的BasicNameValuePair(“mybt”,changeBloodType(blood_picker.getValue()));
添加(新的BasicNameValuePair(“mynum”,“myPhone.getText());
添加(新的BasicNameValuePair(“yournum”,“+partnerPhone.getText());
添加(新的BasicNameValuePair(“myregID”,regid));
试一试{
Log.v(“setEntity”、“before”);
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
Log.v(“setEntity”、“after”);
}捕获(不支持DencodingException e1){
Log.v(“UnsupportedEncodingException”,”);
e1.printStackTrace();
}
//172.16.101.28
试试{
日志v(“后”、“前”);
HttpResponse HttpResponse=httpclient.execute(httppost);
Log.v(“post”、“after”);
Log.v(“HttpResponse”,HttpResponse.getEntity().toString());
}捕获(客户端协议例外e){
Log.v(“ClientProtocolException”、“ClientProtocolException”);
e、 printStackTrace();
}捕获(IOE异常){
Log.v(“IOException”、“IOException”);
e、 printStackTrace();
}
返回味精;
}
@凌驾
受保护的void onPostExecute(字符串msg){
Log.v(“AsyncTask”、“onPostExecute”);
}
}.执行(空,空,空);
}
我在代码'log.v(“AsyncTask”,“doInBackground”);'中有一个log语句


但它不会出现在日志记录器的Log.v(“AsyncTask”、“doInBackground”);中

您应该与executor一起执行任务

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
因为在较低版本的Android中,所有异步任务都是在单个后台线程中执行的。因此,新任务可能正在等待,直到其他任务开始工作

在Android的较低版本中(实际上是在pre-Honeycom上),您不能在executor上执行AsyncTask

将代码更改为

public void executeAsyncTask()
{
    AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.e("AsyncTask", "onPreExecute");
        }

        @Override
        protected String doInBackground(Void... params) {
            Log.v("AsyncTask", "doInBackground");
            String msg = null;
            // some calculation logic of msg variable
            return msg;
        }
        @Override
        protected void onPostExecute(String msg) {
            Log.v("AsyncTask", "onPostExecute");
        }
    };

    if(Build.VERSION.SDK_INT >= 11/*HONEYCOMB*/) {
        task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    } else {
        task.execute();
    }
}
public void executeAsyncTask()
{
AsyncTask任务=新建AsyncTask(){
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.e(“AsyncTask”、“onPreExecute”);
}
@凌驾
受保护字符串doInBackground(无效…参数){
Log.v(“AsyncTask”、“doInBackground”);
字符串msg=null;
//msg变量的一些计算逻辑
返回味精;
}
@凌驾
受保护的void onPostExecute(字符串msg){
Log.v(“AsyncTask”、“onPostExecute”);
}
};
如果(Build.VERSION.SDK_INT>=11/*蜂巢*/){
task.executeOnExecutor(异步task.THREAD\u POOL\u EXECUTOR);
}否则{
task.execute();
}
}

我也处于同样的情况

  • 我打了一个调用
    AsyncTask.cancel(布尔可能中断frunning)
    传递true
  • 然后我假设(我错了)这个任务的
    doInBackground()
    现在被中断了
  • 通过添加日志语句,我意识到第一个
    asyncTask
    仍在运行。。。从而防止执行另一个
    asyncTask
    。它的代码< dodoBead()方法在循环中运行无限,所以我只需要改变条件来考虑所有可能的“中断”情况……/P>这对你不起作用吗? 我已经这样做了,但问题仍然存在,问题是我使用
    AsyncTask
    运行长时间的后台任务,这些任务会永远运行,因此
    ThreadPoolExecutor
    的工作线程已经被占用

    在我的例子中,
    AsyncTask.THREAD\u POOL\u EXECUTOR
    (使用调试器获取执行器属性)具有以下ff属性:

    maximumPoolSize = 3
    largetsPoolSize = 2
    corePoolSize =2 
    
    因此,禁用一个长期运行的异步任务使我的doInBackground代码得以运行,但这不是正确的解决方案


    正确的解决方案是,我将长时间运行的任务移动到自定义线程中,而不是使用
    AsyncTask

    引用Android文档

    首次引入时,AsyncTasks是在单个服务器上串行执行的 背景线程。从甜甜圈开始,它被改成了一个 允许多个任务并行运行的线程。从 蜂窝,任务在单个线程上执行,以避免常见的 并行执行导致的应用程序错误

    如果确实需要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,对象[])与 线程池执行器

    使用此代码段触发异步任务:

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
       asyncTaskInstance.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
       pdfPageChanger.execute(params);
    

    尝试.execute()而不是.execute(null,null,null);结果是一样的。。。你为什么认为这是一个解决办法?在本地,它与“.execute(null,null,null)”配合得很好,可能还有另一个异步任务executing@brights
    maximumPoolSize = 3
    largetsPoolSize = 2
    corePoolSize =2 
    
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
       asyncTaskInstance.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
    else
       pdfPageChanger.execute(params);