HttpURLConnection не работает на Android
У меня проблема и правда не знаю что не так:-/
У меня есть простая функция, вызываемая после нажатия кнопки
public void clickFunc(View view) {
StringBuilder result = new StringBuilder();
try {
URL url = new URL("http://google.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
int responseCode=conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
InputStream in = new BufferedInputStream(conn.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
in.close();
httpTxt.setText(result.toString());
}
else {
httpTxt.setText("false : "+responseCode);
}
}
catch(Exception e){
httpTxt.setText("Exception: " + e.getMessage());
}
}
Но после клика мой вывод - Exception: null
В манифесте у меня есть <uses-permission android:name="android.permission.INTERNET" />
Этот код, по моему мнению, такой же, как и все коды, упомянутые здесь или в Интернете:-/
httptxt - мой текстовый вид для вывода со страницы
Спасибо
2 ответа
Хорошо, я не знал, что я должен сделать это в фоновом режиме... это работает сейчас, спасибо!
public void clickFunc(View view) {
new SendPostRequest().execute();
}
private class SendPostRequest extends AsyncTask<Void, Void, String> {
protected String doInBackground (Void... params) {
StringBuilder result = new StringBuilder();
HttpURLConnection conn = null;
BufferedReader reader;
try {
URL url = new URL("http://stackru.com");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setDoInput(true);
conn.setDoOutput(true);
conn.connect();
int responseCode=conn.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
InputStream in = new BufferedInputStream(conn.getInputStream());
reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
in.close();
return(result.toString());
}
else {
return("false : "+responseCode);
}
}
catch(Exception e){
return("Exception: " + e.getMessage());
}
}
protected void onPostExecute(String s) {
super.onPostExecute(s);
httpTxt.setText(s);
}
}
Я не программист Android, так что даже если я не знал этого, извините, ребята:)
О моем приложении, если вам интересно, почему я этого хотел - я читаю штрих-код, захожу в скрипт php, просматриваю базу данных, если есть этот код, и возвращаю true или false
На андроиде много потоков. Когда вы нажимаете http-запрос, это означает, что он будет работать с другим потоком, поэтому, если вы хотите выполнить http-запрос, вы должны поместить его в асинхронный класс, потому что это длинная операция, и, наконец, если Если вы хотите изменить ответ http, вы должны поместить свои изменения в поток пользовательского интерфейса, что означает, что он должен быть ниже Handler
или же RunOnUiThread
потому что асинхронная задача не может иметь доступ к потоку пользовательского интерфейса напрямую, если вы не хотите использовать Async task и runUiThred, ни один из обработчиков не использует залп, это API Google позволяет