HttpURLConnection .getInputStream() перестать работать

Я создаю проект Android, где ActivityMain подключается к файлу PHP (на локальном сервере, localhost) с помощью HttpURLConnection;

У меня проблема со следующей строкой кода:

bufferedReader = new BufferedReader(new InputStreamReader((conn.getErrorStream())));

Когда я запускаю проект, приложение останавливается на этом этапе, без каких-либо ошибок.

В чем проблема?

Я сообщаю часть кода здесь:

public class SendToLogin extends AsyncTask<String, Object, String> {

//private EditText usernameField,passwordField;
private String username, password;
private Context context;
private Boolean loggato = false;
JSONObject rspJ;


public SendToLogin(String usr, String psw, Context c) {
    username = usr;
    password = psw;
    context = c;
}

@Override
protected void onPreExecute() {

}

@Override
protected String doInBackground(String... params) {
    String link = params[0] + "?username=" + username.toString() + "&password=" + password.toString();
    URL url = null;
    HttpURLConnection conn = null;
    BufferedReader bufferedReader = null;
    String result = "";
    String line = "";
    try {

        url = new URL(link);
        conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setReadTimeout(1000);
        conn.setDoInput(true);
        int status = conn.getResponseCode();


        bufferedReader = new BufferedReader(new InputStreamReader((conn.getErrorStream())));

        while ((line = bufferedReader.readLine()) != null) {
            result += line + "\n";
        }
        bufferedReader.close();
        return result;
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

@Override
protected void onPostExecute(String s) {
    //super.onPostExecute(aVoid);
    String result = s;
    JSONObject reader = null;
    try {
        reader = new JSONObject(result);
        String query_result = reader.getString("msg");
        if(query_result.toString() == "ok")
            new ListaUtenti();
        else {
            Toast loginErrorToast = Toast.makeText(context, "Errore! login errato!", Toast.LENGTH_SHORT);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    //new ReceiveToLogin().execute();

}

}

(PHP-код возвращает строку JSON правильно, когда я использую браузер, чтобы проверить это)

Спасибо вам.

3 ответа

  1. conn.getErrorStream() должно быть conn.getInputStream() как заявлено @mallaudin
  2. super.onPostExecute(aVoid); не следует комментировать. Так должно быть super.onPostExecute(s);
  3. В строке сравнения Java это как query_result.toString().equals('ok') не как query_result.toString()=='ok'
  4. Можете ли вы войти status переменная вместо комментария?

Вам нужно позвонить conn.connect() до получения потока.

conn.connect(); // connect before getting stream
bufferedReader = new BufferedReader(new InputStreamReader((conn.getInputStream())));

Также вы возвращаетесь null от doInBackground и у вас нет нулевой регистрации onPostExecute что приведет к NullPointerException на reader = new JSONObject(result); в случае исключения в фоновом режиме.

@Override
protected void onPostExecute(String s) {
    //super.onPostExecute(aVoid);
    String result = s; // check null here.
    JSONObject reader = null;

Я следовал приведенному ниже коду отсюда, и он работает нормально для меня

// Given a URL, establishes an HttpUrlConnection and retrieves
// the web page content as a InputStream, which it returns as
// a string.
private String downloadUrl(String myurl) throws IOException {
    InputStream is = null;
    // Only display the first 500 characters of the retrieved
    // web page content.
    int len = 500;

    try {
        URL url = new URL(myurl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setReadTimeout(10000 /* milliseconds */);
        conn.setConnectTimeout(15000 /* milliseconds */);
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        // Starts the query
        conn.connect();
        int response = conn.getResponseCode();
        Log.d(DEBUG_TAG, "The response is: " + response);
        is = conn.getInputStream();

        // Convert the InputStream into a string
        String contentAsString = readIt(is, len);
        return contentAsString;

    // Makes sure that the InputStream is closed after the app is
    // finished using it.
    } finally {
        if (is != null) {
            is.close();
        }
    }
}

// Reads an InputStream and converts it to a String.
public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
    Reader reader = null;
    reader = new InputStreamReader(stream, "UTF-8");
    char[] buffer = new char[len];
    reader.read(buffer);
    return new String(buffer);
}

Смотрите консоль для кода ответа и ответа

Другие вопросы по тегам