【问题标题】:HttpURLConnection .getInputStream() stop workingHttpURLConnection .getInputStream() 停止工作
【发布时间】:2016-11-20 10:04:38
【问题描述】:

我正在创建一个 Android 项目,其中 ActivityMain 使用 HttpURLConnection 连接到 PHP 文件(在本地服务器,localhost 中);

我对以下代码行有疑问:

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 行)

谢谢。

【问题讨论】:

  • permission.INTERNET 已在您的应用中设置?您的捕获错过了SecurityException
  • getErrorStream() 调用可能会返回 null,而您有一个 NullPointerException。到目前为止的答案建议使用输入流,如果您打算从服务器读取实际响应,这听起来是正确的选择。如果是您要读取的错误流,请在尝试读取之前检查它不是null
  • 是的,对不起,我发布的部分有错误,在项目中我写了 bufferedReader = new BufferedReader(new InputStreamReader((conn.getInputStream())));
  • status 能得到什么?
  • 这是一个尝试我忘记评论的东西的行

标签: android httpurlconnection inputstreamreader


【解决方案1】:

您需要在获取流媒体之前致电conn.connect()

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

另外,您从doInBackground 返回null,并且您没有在onPostExecute 中进行空检查,这将导致NullPointerExceptionreader = new JSONObject(result); 上出现异常情况。

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

【讨论】:

  • ok,但是在返回之前执行停止;当有conn.getInputStreamReader() 没有返回错误或异常时它会停止
  • 好的,谢谢,但问题在于:我添加了conn.connect(),但我仍然有问题;现在执行在这一点停止。为什么?
  • 你现在哪里遇到问题了?您是否从 doInBackground 返回了结果?
  • 您是否在清单中设置了internet permission?请发布堆栈跟踪。
  • 好的,我找到了问题:问题是conn.setDoInput(true); 没有这一行,执行是正确的。谢谢大家!
【解决方案2】:

我遵循here 的以下代码,它对我来说工作正常

// 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);
}

查看控制台获取响应代码和响应

【讨论】:

    【解决方案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.setDoInput(true); 没有这一行,执行是正确的。谢谢大家!
    猜你喜欢
    • 2018-01-13
    • 2013-03-11
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2011-09-05
    相关资源
    最近更新 更多