2016-11-20 17 views
0

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

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

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 строку правильно, когда я использую браузер, чтобы проверить его)

Спасибо вам.

+0

'' разрешение.INTERNET'' установлено в вашем приложении? Ваши уловы пропускают «SecurityException». – Grisgram

+0

Вызов 'getErrorStream()' вероятно, возвращает 'null', и у вас есть' NullPointerException'. Ответы до сих пор предлагают использовать входной поток, который звучит как правильный выбор, если вы намерены прочитать фактический ответ с сервера. Если это поток ошибок, который вы хотите прочитать, убедитесь, что он не «null», прежде чем пытаться его прочитать. –

+0

Да, извините, я отправляю часть с ошибкой, в проекте я пишу bufferedReader = new BufferedReader (новый InputStreamReader ((conn.getInputStream()))); – LukeV

ответ

0

Перед тем, как получить поток, необходимо позвонить 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; 
+0

нормально, но выполнение останавливается перед возвратом; он останавливается, когда есть 'conn.getInputStreamReader()' без ошибки возврата или исключения – LukeV

+0

@LukeV У меня есть обновленный ответ. Пожалуйста, смотрите. – mallaudin

+0

ОК, спасибо, но проблема осталась: я добавляю 'conn.connect() ', но у меня все еще есть проблема; Теперь выполнение останавливается в этом пункте. Зачем? – LukeV

0

я следовал ниже код из 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); 
} 

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

0
  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 переменную вместо комментариев?
+0

Хорошо, я нашел проблему: проблема была 'conn.setDoInput (true);' Без этой строки выполнение выполняется правильно. Спасибо всем! – LukeV