[Android] AsyncTask; doInbackground () не вызывается после вызова метода onPreExecute ()


Answers

Я был в той же ситуации.

  1. Я позвонил AsyncTask.cancel (boolean mayInterruptIfRunning), передав true
  2. Затем я предположил (я был неправ), что doInBackground этой задачи теперь прерван

Добавляя логические операторы, я понял, что первая задача async все еще работает ... таким образом, предотвращая выполнение другого асинхронного тэга. Это метод doInBackground запускал бесконечный цикл while, поэтому мне просто пришлось изменить условие, чтобы рассмотреть все возможные «прерывающие» случаи ...

Question

Я добавил асинхронную библиотеку в свой проект и уже проверил, я не знаю, почему поток кода не входит в 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»);




Это не работает для вас?

task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

Я уже делал это, и проблема все еще была, проблема заключалась в том, что я использовал AsyncTask для запуска длинных фоновых задач, которые выполняются навсегда, поэтому рабочие потоки ThreadPoolExecutor уже заняты.

В моем случае AsyncTask.THREAD_POOL_EXECUTOR (использовать отладчик для получения ваших свойств исполнителя) имел свойства ff:

maximumPoolSize = 3
largetsPoolSize = 2
corePoolSize =2 

Таким образом, отключение одной из длительных асинхронных задач заставило мой код doInBackground работать, но это неправильное решение.

Правильное решение заключается в том, что я переносил длительные задачи в пользовательские потоки, а не с помощью AsyncTask .




Links