AsyncTask;调用方法onPreExecute()后没有调用doInbackground()

时间:2014-11-12 15:31:26

标签: android android-asynctask

我在我的项目中添加了异步库并已经检查过,我不知道为什么代码流不会进入asynctask

代码

public void doMysql()
{
    Log.v("doMysql", "accessed");

    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 = "";

            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://172.16.100.172:52273/mysql");

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

            nameValuePairs.add(new BasicNameValuePair("myday", Integer.toString(day_picker.getYear()) + 
                    addZero(day_picker.getMonth() + 1) + 
                    addZero(day_picker.getDayOfMonth())));
            nameValuePairs.add(new BasicNameValuePair("mystar", changeStar(day_picker.getMonth() + 1, day_picker.getDayOfMonth())));
            nameValuePairs.add(new BasicNameValuePair("mybt", changeBloodType(blood_picker.getValue())));
            nameValuePairs.add(new BasicNameValuePair("mynum", "" + myPhone.getText()));
            nameValuePairs.add(new BasicNameValuePair("yournum", "" + partnerPhone.getText()));
            nameValuePairs.add(new BasicNameValuePair("myregID", regid));
            try {
                Log.v("setEntity", "before");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                Log.v("setEntity", "after");

            } catch (UnsupportedEncodingException e1) {
                Log.v("UnsupportedEncodingException", "");
                e1.printStackTrace();
            }
            //172.16.101.28
            try {  
                Log.v("post", "before");
                HttpResponse httpresponse = httpclient.execute(httppost);
                Log.v("post", "after");
                Log.v("HttpResponse ",httpresponse.getEntity().toString());
            } catch (ClientProtocolException e) {
                Log.v("ClientProtocolException", "ClientProtocolException");
                e.printStackTrace();
            } catch (IOException e) {
                Log.v("IOException", "IOException");

                e.printStackTrace();
            }

            return msg;
        }
        @Override
        protected void onPostExecute(String msg) {
            Log.v("AsyncTask", "onPostExecute");

        }
    }.execute(null, null, null);
}

我在代码'Log.v(“AsyncTask”,“doInBackground”)中有一个日志语句;'

但它没有出现在记录器'Log.v(“AsyncTask”,“doInBackground”)中;'

4 个答案:

答案 0 :(得分:48)

您应该使用执行者

执行您的任务
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

因为在较低版本的Android中,所有AsyncTasks都是在单个后台线程上执行的。所以新任务可能正在等待,直到其他任务正常工作。

在Android的较低版本中(实际上在pre-HONEYCOMB上),您无法在执行程序上执行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();
    }
}

答案 1 :(得分:5)

我处于同样的境地。

  1. 我打了电话AsyncTask.cancel(boolean mayInterruptIfRunning)传递真实的
  2. 然后我假设(我错了)此任务的doInBackground()现已中断
  3. 通过添加日志语句,我意识到第一个asyncTask仍在运行...因此阻止了另一个asyncTask执行。它的doInBackground()方法运行了一个无限循环,所以我只需要改变条件来考虑所有可能的“中断”情况......

答案 2 :(得分:4)

这样做不适合你吗?

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

我已经这样做了,问题仍然存在,问题是我使用AsyncTask来运行永远运行的长后台任务,所以ThreadPoolExecutor的工作线程已经被占领了。

在我的情况下AsyncTask.THREAD_POOL_EXECUTOR(使用调试器获取执行程序属性)具有ff属性:

maximumPoolSize = 3
largetsPoolSize = 2
corePoolSize =2 

因此,禁用其中一个长时间运行的asyncTasks会使我的doInBackground代码运行,但这不是正确的解决方案。

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

答案 3 :(得分:4)

引用Async Task

的Android文档
  

首次引入时,AsyncTasks在单个上串行执行   背景线程。从DONUT开始,这被改成了一个池   允许多个任务并行运行的线程。从...开始   HONEYCOMB,任务在单个线程上执行以避免常见   并行执行导致的应用程序错误。

     

如果您真的想要并行执行,可以调用   executeOnExecutor(java.util.concurrent.Executor,Object [])with   THREAD_POOL_EXECUTOR。

使用此代码段触发AsyncTask:

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