Привет, я пытаюсь сделать простой HTTP-пост на PHP-сервере, который принимает данные POST $ _POST ['username'].Получение ошибки NetworkOnMainThread при попытке выполнить HTTP-сообщение
public void sendMessage(View view){
String result = "";
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
Toast.makeText(
getApplicationContext(),
"Attempting to open second activity",
Toast.LENGTH_LONG
).show();
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("username","ghost"));
InputStream is = null;
// ATTEMPT HTTP POST
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://example.com/getuserbyuname");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection (Reason: " + e.toString() + ")");
}
сервер будет возвращать JSON отформатированный сообщение как это:
{"response":"404"}
У меня возникли проблемы с android.os.NetworkOnMainThread. Я знаю, что это связано с тем, что моя программа пытается выполнить сетевую работу из основного потока пользовательского интерфейса.
Я попытался это:
public class AccountConnector extends AsyncTask <String, Integer, Long>{
@Override
protected Long doInBackground(String... params)
{
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("username","bond"));
InputStream is = null;
// ATTEMPT HTTP POST
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://example.com/getuserbyuname");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection (Reason: " + e.toString() + ")");
}
return null;
}
... остальной код опущен ...
Может кто-нибудь мне точку в правильном направлении?
Из любопытства: почему вы хотите, чтобы ваша сеть ввода/вывода для запуска в главном потоке? – mthmulders
Использование AsynchTask (http://developer.android.com/reference/android/os/AsyncTask.html) Пример: http://stackoverflow.com/questions/17057712/pass-arraylist-bean-from-android-to- webservice-php/17058208 # 17058208 –
@mthmulders в основном для проверки того, существует ли запрашиваемое uname в БД или нет. – Jeremy