Нулевая строка Android передана из AsyncTask в службу - PullRequest
0 голосов
/ 30 июня 2011

У меня есть служба, которая запускает AsyncTask для получения некоторых данных с устройства в моей домашней сети. Когда AsyncTask выполнен, он передает данные, считанные обратно в Сервис, используя callback-интерфейс в onPostExecute, который реализует Сервис. Служба затем читает информацию в переданной строке и делает вещи в зависимости от информации. Это прекрасно работает 9/10 раз, но иногда строка, передаваемая из асинхронной задачи, равна нулю.

AsyncTask doInBackground:

private String result = "No results";
@Override
    protected Void doInBackground(Void... params) {
            try {
                    OutputStreamWriter wr = new OutputStreamWriter(mConnection.getOutputStream());
                    wr.write(body);
                    wr.flush();

                    BufferedReader rd = new BufferedReader(new InputStreamReader(mConnection.getInputStream()));
                    String line;
                    while ((line = rd.readLine()) != null) {
                            result = line;
                    }
                    wr.close();
                    rd.close();
            } catch (Exception e) {
                    result = e.getMessage();
            }
            return null;
    }

    protected void onPostExecute(Void result) {
            mListener.onHttpResponse(this.result, REQUEST_CODE);
    }

}

Сервис на HTTPResponse:

@Override
    public void onHttpResponse(String response, int REQUEST_CODE) {
            ResponseEnterpreter mEnterpreter = new ResponseEnterpreter(response);
            switch (REQUEST_CODE) {
               case WidgetConstants.REQUEST_LED_STATE :
                   String artist = mEnterpreter.getArtist();  <--- NullPointerException 

ResponseEnterpreter getArtist:

public class ResponseEnterpreter {
    private String mResponse;


    public ResponseEnterpreter(String mResponse) {
            this.mResponse = mResponse;
    }
        public String getArtist() {
            int first_index = mResponse.lastIndexOf("&lt;dc:creator&gt;");
            if (first_index == -1) {
                    return null;
            }

            int last_index = mResponse.lastIndexOf("&lt;/dc:creator&gt;");
            String artist = mResponse.substring(first_index + "&lt;dc:creator&gt;".length(), last_index);

            return unEscapeString(artist);

    }

Насколько я понимаю, строка результата инициализируется как "Нет результатов", и если BufferedReader не получает результат, "Нет результата" - это строка, которую следует передать. Для mConnection задано время ожидания 3 с.

Я действительно почесал голову над этим ....

Есть идеи?

// Фредрик

1 Ответ

0 голосов
/ 30 июня 2011

Методы onPostExecute получают значения, возвращаемые из doInBackground в качестве аргументов, поэтому вы должны реализовывать эти методы по-разному:

protected String doInBackground(Void... params) {
        try {
                //[..]

        } catch (Exception e) {
                return e.getMessage();
        }
        return result;
}

protected void onPostExecute(String result) {
        mListener.onHttpResponse(result, REQUEST_CODE);
}

Вы переопределяете результат на каждом шаге цикла и заканчиваете только последней строкойдокумента:

 while ((line = rd.readLine()) != null) {
     result = line;
 }
...