Search code examples
androidhttpconnection

Error in connecting localhost


I know this question has been asked for several times, but I am helpless now.

I have a php webpage at localhost that echo "Hello". (working perfect at localhost). I have following code that displays response from localhost web page to TextView in my app.

tv = (TextView) findViewById(R.id.txtTest);
InputStream is = null;
String result = "";
    String url = "http://10.0.2.2/android/try.php";
    HttpClient httpclient = new DefaultHttpClient();

    try {               
        HttpPost httppost = new HttpPost(url);

        HttpResponse response = httpclient.execute(httppost);

        Log.d("myapp", "response " + response.getEntity());

        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        String st = EntityUtils.toString(response.getEntity());


    } catch (Exception e) {
        Log.e("log_tag", "Error in http connection " + e.toString());
    }

    // convert response to string
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "UTF-8"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
    } catch (Exception e) {
        Log.e("log_tag", "Error converting result " + e.toString());
    }

    tv.setText(result.toString());

I am getting following error (LogCat).

09-24 13:34:42.654: E/log_tag(2032): Error in http connection android.os.NetworkOnMainThreadException
09-24 13:34:42.654: E/log_tag(2032): Error converting result java.lang.NullPointerException

P.S I have added Internet permission in Manifest.


Solution

  • You should do network operations (connection and so on) from a different thread than the main (UI) thread. That's what the error android.os.NetworkOnMainThreadException you are getting means.

    You should look either into ASyncTask or Thread to do that.

    Read this article too...

    Replace the code you currently have with this:

        AsyncTask<Void,Void,Void> my_task = new AsyncTask<Void,Void,Void>() {
            @Override
            protected void onPostExecute() {
                TextView  tv = (TextView) findViewById(R.id.txtTest);
                tv.setText(result.toString());
            }
    
            @Override
            protected Void doInBackground(Void... voids) {
                InputStream is = null;
                String result = "";
                String url = "http://10.0.2.2/android/try.php";
                HttpClient httpclient = new DefaultHttpClient();
    
                try {
                    HttpPost httppost = new HttpPost(url);
    
                    HttpResponse response = httpclient.execute(httppost);
    
                    Log.d("myapp", "response " + response.getEntity());
    
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();
                    String st = EntityUtils.toString(response.getEntity());
    
    
                } catch (Exception e) {
                    Log.e("log_tag", "Error in http connection " + e.toString());
                }
    
                // convert response to string
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(
                            is, "UTF-8"), 8);
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    is.close();
                    result = sb.toString();
                } catch (Exception e) {
                    Log.e("log_tag", "Error converting result " + e.toString());
                }
            }
        }.execute();