2016-11-20 13 views
0

ActivityMain이 HttpURLConnection을 사용하여 로컬 파일의 로컬 호스트에있는 PHP 파일에 연결하는 Android 프로젝트를 만듭니다. 내가 프로젝트를 실행하면HttpURLConnection .getInputStream() 작동 중지

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

'permission.INTERNET''이 앱에 설정되어 있습니까? 귀하의 캐치는''SecurityException''을 놓치고 있습니다. – Grisgram

+0

'getErrorStream()'호출은 아마도'null'을 리턴하고 당신은'NullPointerException'을 가지고 있습니다. 지금까지의 대답은 입력 스트림을 사용하는 것이 좋습니다. 입력 스트림은 서버에서 실제 응답을 읽는 것이 옳은 선택 인 것처럼 들립니다. 읽는 오류 스트림 인 경우 읽으려고 시도하기 전에 'null'이 아닌지 확인하십시오. –

+0

네, 죄송합니다, 오류가있는 부분을 게시하고, 프로젝트에 write write bufferedReader = new BufferedReader (new InputStreamReader (conn.getInputStream()))); – LukeV

답변

0

스트림을 받으려면 먼저 conn.connect()으로 전화해야합니다.

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

은 또한 당신은 doInBackground에서 null를 반환하고 있고 백그라운드에서 예외의 경우 reader = new JSONObject(result);NullPointerException의 원인이됩니다 onPostExecute에서 널 체크를하지 않습니다.

@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()
  2. @mallaudin 언급 한 바와 같이 conn.getInputStream()을해야한다
  3. super.onPostExecute(aVoid);은 주석 처리하지 않아야합니다. 그것은 자바 문자열에서 super.onPostExecute(s);
  4. query_result.toString()=='ok'
  5. 당신이 status 변수 대신 코멘트를 기록 할 수 있습니다 좋아하지 query_result.toString().equals('ok')처럼 비교되어야 하는가?
+0

을 true로 설정했습니다. 문제는 'conn.setDoInput (true);입니다.'이 줄이 없으면 실행이 올바른 것입니다. 감사합니다. – LukeV