tipiwiny
tipiwiny

Reputation: 409

Android Studio - FATAL EXCEPTION: AsyncTask #1

I´m trying connect my app with my WebServer. I dont understand what is the mistake. I prove my code for a example more easy and this had work it. thanks.

Here is my code

package com.glam;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.os.SystemClock;
import android.os.Vibrator;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.Html;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.glam.custom.CustomActivity;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;

/**
 * The Activity Login is launched after the Home screen. You need to write your
 * logic for actual Login. You also need to implement Facebook Login if
 * required.
 */
public class Login extends CustomActivity
{
    EditText user;
    EditText pass;
    Button blogin;
    Httppostaux post;
    String URL_connect = "http://aaaa.com/php/login.php";
    boolean result_back;
    private ProgressDialog pDialog;
    /** The pager. */
    private ViewPager pager;

    /** The view that hold dots. */
    private LinearLayout vDots;

    /* (non-Javadoc)
     * @see android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)
     */
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.login);

       //setupView();

        initPager();

        Button buttonFacebook=(Button)findViewById(R.id.btnFacebook);
        buttonFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(Login.this, MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(i);
                finish();
            }
        });


        user = (EditText) findViewById(R.id.etEmailLogin);
        pass = (EditText) findViewById(R.id.etContraseñaLogin);
        blogin = (Button) findViewById(R.id.btnEnviarLogin);

        blogin.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {

                // Extreamos datos de los EditText
                String usuario = user.getText().toString();
                String passw = pass.getText().toString();

                // verificamos si estan en blanco
                if (checklogindata(usuario, passw) == true) {

                    // si pasamos esa validacion ejecutamos el asynctask pasando
                    // el usuario y clave como parametros

                    new asynclogin().execute(usuario, passw);

                } else {
                    // si detecto un error en la primera validacion vibrar y
                    // mostrar un Toast con un mensaje de error.
                    err_login();
                }

            }
        });




    }

    // vibra y muestra un Toast
    public void err_login() {
        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
        vibrator.vibrate(200);
        Toast toast1 = Toast.makeText(getApplicationContext(),
                "Error:Nombre de usuario o password incorrectos",
                Toast.LENGTH_SHORT);
        toast1.show();
    }

    /*
     * Valida el estado del logueo solamente necesita como parametros el usuario
     * y passw
     */
    public boolean loginstatus(String username, String password) {
        int logstatus = -1;

        /*
         * Creamos un ArrayList del tipo nombre valor para agregar los datos
         * recibidos por los parametros anteriores y enviarlo mediante POST a
         * nuestro sistema para relizar la validacion
         */
        ArrayList<NameValuePair> postparameters2send = new ArrayList<NameValuePair>();

        postparameters2send.add(new BasicNameValuePair("email", username));
        postparameters2send.add(new BasicNameValuePair("clave", password));

        // realizamos una peticion y como respuesta obtenes un array JSON
        JSONArray jdata = post.getserverdata(postparameters2send, URL_connect);



        // si lo que obtuvimos no es null
        if (jdata != null && jdata.length() > 0) {

            JSONObject json_data; // creamos un objeto JSON
            try {
                json_data = jdata.getJSONObject(0); // leemos el primer segmento
                // en nuestro caso el unico
                logstatus = json_data.getInt("logstatus");// accedemos al valor
                Log.e("loginstatus", "logstatus= " + logstatus);// muestro por
                // log que
                // obtuvimos
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // validamos el valor obtenido
            if (logstatus == 0) {// [{"logstatus":"0"}]
                Log.e("loginstatus ", "invalido");
                return false;
            } else {// [{"logstatus":"1"}]
                Log.e("loginstatus ", "valido");
                return true;
            }

        } else { // json obtenido invalido verificar parte WEB.
            Log.e("JSON  ", "ERROR");
            return false;
        }

    }

    // validamos si no hay ningun campo en blanco
    public boolean checklogindata(String username, String password) {

        if (username.equals("") || password.equals("")) {
            Log.e("Login ui", "checklogindata user or pass error");
            return false;

        } else {

            return true;
        }

    }

    /*
     * CLASE ASYNCTASK
     *
     * usaremos esta para poder mostrar el dialogo de progreso mientras enviamos
     * y obtenemos los datos podria hacerse lo mismo sin usar esto pero si el
     * tiempo de respuesta es demasiado lo que podria ocurrir si la conexion es
     * lenta o el servidor tarda en responder la aplicacion sera inestable.
     * ademas observariamos el mensaje de que la app no responde.
     */

    class asynclogin extends AsyncTask<String, String, String> {



        String user, pass;

        protected void onPreExecute() {
            // para el progress dialog
            pDialog = new ProgressDialog(Login.this);
            pDialog.setMessage("Autenticando....");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected String doInBackground(String... params) {
            // obtnemos usr y pass
            user = params[0];
            pass = params[1];

            // enviamos y recibimos y analizamos los datos en segundo plano.
            if (loginstatus(user, pass) == true) {
                return "ok"; // login valido
            } else {
                return "err"; // login invalido
            }

        }

        /*
         * Una vez terminado doInBackground segun lo que halla ocurrido pasamos
         * a la sig. activity o mostramos error
         */
        protected void onPostExecute(String result) {

            pDialog.dismiss();// ocultamos progess dialog.
            Log.e("onPostExecute=", "" + result);

            if (result.equals("ok")) {

                Intent i = new Intent(Login.this, MainActivity.class);
                i.putExtra("user", user);
                startActivity(i);

            } else {
                err_login();

            }

        }

    }


    /**
     * Setup the click & other events listeners for the view components of this
     * screen. You can add your logic for Binding the data to TextViews and
     * other views as per your need.
     */
    private void setupView()
    {
        Button b = (Button) setTouchNClick(R.id.btnReg);
        b.setText(Html.fromHtml(getString(R.string.sign_up)));

        setTouchNClick(R.id.btnLogin);
        setTouchNClick(R.id.btnForget);
        setTouchNClick(R.id.btnFacebook);

        initPager();
    }

    /**
     * Inits the pager view.
     */
    private void initPager()
    {
        pager = (ViewPager) findViewById(R.id.pager);
        pager.setPageMargin(10);

        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int pos)
            {
                if (vDots == null || vDots.getTag() == null)
                    return;
                ((ImageView) vDots.getTag())
                        .setImageResource(R.drawable.dot_gray);
                ((ImageView) vDots.getChildAt(pos))
                        .setImageResource(R.drawable.dot_blue);
                vDots.setTag(vDots.getChildAt(pos));
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2)
            {
            }

            @Override
            public void onPageScrollStateChanged(int arg0)
            {
            }
        });
        vDots = (LinearLayout) findViewById(R.id.vDots);

        pager.setAdapter(new PageAdapter());
        setupDotbar();
    }

    /**
     * Setup the dotbar to show dots for pages of view pager with one dot as
     * selected to represent current page position.
     */
    private void setupDotbar()
    {
        LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
                android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
        param.setMargins(10, 0, 0, 0);
        vDots.removeAllViews();
        for (int i = 0; i < 5; i++)
        {
            ImageView img = new ImageView(this);
            img.setImageResource(i == 0 ? R.drawable.dot_blue
                    : R.drawable.dot_gray);
            vDots.addView(img, param);
            if (i == 0)
            {
                vDots.setTag(img);
            }

        }
    }

    /**
     * The Class PageAdapter is adapter class for ViewPager and it simply holds
     * a Single image view with dummy images. You need to write logic for
     * loading actual images.
     */
    private class PageAdapter extends PagerAdapter
    {

        /* (non-Javadoc)
         * @see android.support.v4.view.PagerAdapter#getCount()
         */
        @Override
        public int getCount()
        {
            return 5;
        }

        /* (non-Javadoc)
         * @see android.support.v4.view.PagerAdapter#instantiateItem(android.view.ViewGroup, int)
         */
        @Override
        public Object instantiateItem(ViewGroup container, int arg0)
        {
            final ImageView img = (ImageView) getLayoutInflater().inflate(
                    R.layout.img, null);

            img.setImageResource(R.drawable.img_signin);

            container.addView(img,
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT,
                    android.view.ViewGroup.LayoutParams.MATCH_PARENT);
            return img;
        }

        /* (non-Javadoc)
         * @see android.support.v4.view.PagerAdapter#destroyItem(android.view.ViewGroup, int, java.lang.Object)
         */
        @Override
        public void destroyItem(ViewGroup container, int position, Object object)
        {
            try
            {
                // super.destroyItem(container, position, object);
                // if(container.getChildAt(position)!=null)
                // container.removeViewAt(position);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }

        /* (non-Javadoc)
         * @see android.support.v4.view.PagerAdapter#isViewFromObject(android.view.View, java.lang.Object)
         */
        @Override
        public boolean isViewFromObject(View arg0, Object arg1)
        {
            return arg0 == arg1;
        }

    }

    /* (non-Javadoc)
     * @see com.taxi.custom.CustomActivity#onClick(android.view.View)
     */

}

When I execute asynclogin().execute(usuario, passw) --> java.lang.RuntimeException is launched. LogCat

05-03 12:59:41.961    1272-1291/com.glam E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: com.glam, PID: 1272
    java.lang.RuntimeException: An error occured while executing doInBackground()
            at android.os.AsyncTask$3.done(AsyncTask.java:300)
            at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
            at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
            at java.util.concurrent.FutureTask.run(FutureTask.java:242)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
     Caused by: java.lang.NullPointerException
            at com.glam.Login.loginstatus(Login.java:143)
            at com.glam.Login$asynclogin.doInBackground(Login.java:224)
            at com.glam.Login$asynclogin.doInBackground(Login.java:203)
            at android.os.AsyncTask$2.call(AsyncTask.java:288)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)
05-03 12:59:41.989    1272-1272/com.glam W/EGL_genymotion﹕ eglSurfaceAttrib not implemented
05-03 12:59:45.805    1272-1272/com.glam E/WindowManager﹕ android.view.WindowLeaked: Activity com.glam.Login has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{53067a18 V.E..... R......D 0,0-684,192} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:286)
            at com.glam.Login$asynclogin.onPreExecute(Login.java:215)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
            at android.os.AsyncTask.execute(AsyncTask.java:535)
            at com.glam.Login$2.onClick(Login.java:99)
            at android.view.View.performClick(View.java:4438)
            at android.view.View$PerformClick.run(View.java:18422)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5017)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
            at dalvik.system.NativeStart.main(Native Method)

Upvotes: 0

Views: 1111

Answers (1)

Giru Bhai
Giru Bhai

Reputation: 14408

It seems that you didn't initialize Httppostaux post;,that cause null pointer exception at line

JSONArray jdata = post.getserverdata(postparameters2send, URL_connect);

in public boolean loginstatus(String username, String password) { method.

Upvotes: 1

Related Questions