AsyncTask никогда не выполняет doInBackground (но выполняет отладку) (обновление: исправлено) - PullRequest
2 голосов
/ 22 декабря 2011

Fixed : Выяснилось, что проблема заключалась в том, что я очищал ArrayList после передачи его в Задачу, поэтому к тому времени, когда он нашел время для его выполнения, там было нечего отправлять. Он работал в режиме отладки, потому что мог выполнить, прежде чем я позволю ему перейти к следующей строке. Извлеченный урок: не передавайте переменные, которые повторно используются для длительных задач :) Спасибо тем, кто ответил.

Я пытаюсь отправить данные о выборе пользователя на мой веб-сервер с помощью асинхронной задачи. Обычно пользователь делает выбор, и в AsyncTask отправляется строка из 3 или 4 команд. Когда я запускаю код, создается AsyncTask, но никогда не выполняется метод doInBackground. Еще более странным является то, что когда я работаю в режиме отладки и выполняю пошаговые инструкции по созданию задачи, она отлично работает.

private class SendCommandTask extends AsyncTask< ArrayList<Command>, Void, String>{

        protected String doInBackground(ArrayList<Command>... requests){
            conn = null;
            ArrayList<Command> values = requests[0];

            for( int i = 0; i < values.size(); i++){
                try {
                    url = new URL( siteRoot + values.get(i).getEndPoint() );
                    conn = (HttpsURLConnection) url.openConnection();
                    conn.setRequestProperty("Content-Type", "application/json");
                    conn.setRequestProperty("Cookie", authCookie);
                    conn.setReadTimeout(10000 /* milliseconds */);
                    conn.setConnectTimeout(15000 /* milliseconds */);
                    conn.setDoOutput(true);

                    OutputStreamWriter os = new OutputStreamWriter(conn.getOutputStream());
                    os.write(values.get(i).getJson().toString());
                    os.flush();                     
                }catch (IOException e) {
                    e.printStackTrace();
                }
                finally{
                    conn.disconnect();              
                }
            }
            return null;
        }
    }

, который вызывается из потока пользовательского интерфейса с помощью следующего метода:

public void sendCommand(ArrayList<Command> commands){
        new SendCommandTask().execute(commands);
    }

Я смотрел на похожие темы, но они просто предлагают использовать другой метод, который я бы предпочел не делать, так как это, кажется, работает (в отладке :()

1 Ответ

2 голосов
/ 22 декабря 2011

Если кажется, что он не выполняется, что-то может выдать исключение в doInBackground, и в этом случае LogCat будет иметь трассировку стека из фонового потока (возможно, что-то вроде siteRoot равно нулю?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...