-1

recently I have started to develop my first Android app. I have to build a login web service, but my app keeps crashing when HttpRespone is executing. Could Android API 23 be causing this? I read they have dropped support for Apache in this API.

LoginWS.java:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

class LoginWS {
    public String userId ;
    public boolean valid = false ;
    public String token ;
    public String unitId ;
    public String expire;
    public void getLoginAuth(String user, String password) {
        try {
            DefaultHttpClient client = new DefaultHttpClient();
            HttpPut putRequest = new HttpPut("https://documenta-dms.com/DMSWS/api/v1/login/");

            StringEntity input = new StringEntity("<user>\n"
                    + "<username>" + user + "</username>\n"
                    + "<password>" + password + "</password>\n"
                    + "</user>");
            input.setContentType("application/xml");
            putRequest.setEntity(input);
            HttpResponse response = client.execute(putRequest);
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line = null;
            while ((line = rd.readLine()) != null) {

                System.out.println(line);
                if(!line.contains("<html>")){
                    parseXML(line);
                }else{
                    valid=false;
                }


            }
        } catch (UnsupportedEncodingException ex) {
            Logger.getLogger(LoginWS.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(LoginWS.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void parseXML(String line) {
        try {
            org.w3c.dom.Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(line)));
            NodeList response = doc.getElementsByTagName("userToken");
            if (response.getLength() > 0) {
                Element err = (Element) response.item(0);
                expire=err.getElementsByTagName("expires").item(0).getTextContent();
                token=err.getElementsByTagName("token").item(0).getTextContent();
                unitId=err.getElementsByTagName("unitId").item(0).getTextContent();
                userId=err.getElementsByTagName("userId").item(0).getTextContent();
                valid=Boolean.valueOf(err.getElementsByTagName("valid").item(0).getTextContent());
        }else{
            valid=false;
        }
    } catch (ParserConfigurationException ex) {
        Logger.getLogger(LoginWS.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SAXException ex) {
        Logger.getLogger(LoginWS.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(LoginWS.class.getName()).log(Level.SEVERE, null, ex);
    }
}

    public static void main(String[] args) {
    //new LoginWS().getLoginAuth("blank", "blank");
    }
}

Login.java:

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;

public class Login extends AppCompatActivity {
    LoginWS login = new LoginWS();

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);
    }

    private boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        return cm.getActiveNetworkInfo() != null;
    }

    public void onButtonClick(View v){
        if(v.getId() == R.id.login){
            if(!isNetworkConnected()){
                new android.support.v7.app.AlertDialog.Builder(this)
                        .setMessage("No internet connection has been found!")
                        .setCancelable(false)
                        .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                Intent i = new Intent(Settings.ACTION_SETTINGS);
                                startActivity(i);
                            }
                        })
                        .setNegativeButton("Cancel", null)
                        .show();
            } else {
                EditText email = (EditText) findViewById(R.id.email);
                String e_mail = email.getText().toString();
                EditText password = (EditText) findViewById(R.id.password);
                String pword = password.getText().toString();

                login.getLoginAuth(e_mail, pword);

                if (e_mail.equals("blank") && pword.equals("blank")) {
                    Intent i = new Intent(this, MeniuPrincipal.class);
                    startActivity(i);
                    finish();
                } else {
                    new AlertDialog.Builder(this)
                            .setMessage("Incorrect Username or Password!")
                            .show();
                }
            }
        }
    }

    public void onBackPressed() {
        new AlertDialog.Builder(this)
                .setMessage("Are you sure you want to exit?")
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        finish();
                    }
                })
                .setNegativeButton("No", null)
                .show();
    }
}

Errors:

11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime: FATAL EXCEPTION: main
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime: Process: ro.infrasoft.documenta, PID: 18630
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:278)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.view.View.performClick(View.java:5198)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21147)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:  Caused by: java.lang.reflect.InvocationTargetException
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.view.View.performClick(View.java:5198) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21147) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:  Caused by: android.os.NetworkOnMainThreadException
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.net.InetAddress.getAllByName(InetAddress.java:215)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:142)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:169)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:124)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:366)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:560)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:492)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:470)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at ro.infrasoft.documenta.LoginWS.getLoginAuth(LoginWS.java:39)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at ro.infrasoft.documenta.Login.onButtonClick(Login.java:47)
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.support.v7.internal.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:273) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.view.View.performClick(View.java:5198) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:21147) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
11-03 16:41:31.142 18630-18630/ro.infrasoft.documenta E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Thanks in advance!

RayzaN
  • 41
  • 1
  • 2
  • 6
  • 3
    refer this.. http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception – Karthik Nov 03 '15 at 14:52

1 Answers1

1

Android does not allow network connections on the main thread; you'll need to move your logic to an AsyncTask

jonk
  • 1,494
  • 11
  • 13