2013-07-26 3 views
0

Привет, я пытаюсь сделать простой 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; 
} 

... остальной код опущен ...

Может кто-нибудь мне точку в правильном направлении?

+0

Из любопытства: почему вы хотите, чтобы ваша сеть ввода/вывода для запуска в главном потоке? – mthmulders

+1

Использование 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 –

+0

@mthmulders в основном для проверки того, существует ли запрашиваемое uname в БД или нет. – Jeremy

ответ

0

добавить это ..

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
      .permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

положить это в файле манифеста

 <uses-permission android:name="android.permission.INTERNET"/> 
+0

спасибо, я попробую это. – Jeremy

0

правильный способ решения этой проблемы является использование Android AsyncTask для доступа к сети.

ленивый способ обработки это, чтобы включить проверку:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
+0

Я просмотрел вашу ссылку. Однако, цитируя статью, это то, что сказано: «StrictMode следует использовать только во время разработки, а не в вашем реальном приложении». – Jeremy

Смежные вопросы