Zubair
Zubair

Reputation: 107

NullPointerException at startActivity(intent)

For the life of me, I can't seem to find out what's wrong with my code.

AgrUserLoginHome.java
        public void onClick(View v) 
         {
     if(v.getId()==R.id.btnSubmitLogin)
       {
    String username=txtUsername.getText().toString();
    String password=txtPassword.getText().toString();
    //this is passed to be used in next LoginClientServiceThread class
    LoginClientServiceThread verifyLog = new  
            LoginClientServiceThread(this,username,password);
        verifyLog.run();

         }
    }

LoginClientServiceThread.java

    public class LoginClientServiceThread extends Activity implements Runnable{

private Intent intent;
private String username,password;
private Context context;
public LoginClientServiceThread(Context cont,String user,String pass)
{
    username=user;
    password=pass;
    context=cont;
}
public void run() {
    try
    {
        try
        {
            JSONObject json = new JSONObject();
            json.put("username", username);
            json.put("password", password);

            DefaultHttpClient httpClient = new DefaultHttpClient();
            URI uri = new URI("http://10.0.2.2:80/BairyApp/Login.svc");

            HttpPost httppost = new HttpPost(uri + "/verifyLogin");
            httppost.setHeader("Accept", "application/json");
            httppost.setHeader("Content-type", "application/json; charset=utf-8");

            HttpResponse response = httpClient.execute(httppost);
            HttpEntity responseEntity = response.getEntity();

            long intCount = responseEntity.getContentLength();
            char[] buffer = new char[(int)intCount];
            InputStream stream = responseEntity.getContent();
            InputStreamReader reader = new InputStreamReader(stream, "UTF-8");

            try
            {
                reader.read(buffer);
                String str = new String(buffer);
                intent=new Intent(context,TrainerAccessScreen.class);
                intent.putExtra("reading",str);
                if(null!=intent)
                {
                    Toast.makeText(context, "Working",  
                            Toast.LENGTH_LONG).show();
                            //startActivity shows as null here
                    startActivity(intent);
                }
                Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
            }
            catch (IOException e)
            {
                e.printStackTrace();
                Toast.makeText(context, "IOException:"+e.getMessage(),  
                    Toast.LENGTH_LONG).show();
               }
               finally
            {
                stream.close();
            }

        }
        catch(URISyntaxException urise)
        {
            urise.printStackTrace();
            Toast.makeText(context, "urise", Toast.LENGTH_LONG).show();
        }
        catch(ClientProtocolException cpe)
        {
            cpe.printStackTrace();
            Toast.makeText(context, "cpe", Toast.LENGTH_LONG).show();
        }
        catch(IOException ioe)
        {
            ioe.printStackTrace();
            Toast.makeText(context, "ioe", Toast.LENGTH_LONG).show();
        }
    }
    catch(Exception e)
    {
        Toast.makeText(context, "Execution failed: "+e.getMessage(), 
                     Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }
   }
   }

I'm sure the startActivity method is returning a null. I know this because if i change the intent context to "this", the Toast in the IOException directly below it doesn't show.

Any ideas? Oh btw, I'm a beginner so I know the code looks horrible

LogCat

10-26 20:28:48.756: I/dalvikvm(1133): Jit: resizing JitTable from 512 to 1024
10-26 20:41:57.906: W/System.err(1169): java.lang.NullPointerException
10-26 20:41:57.906: W/System.err(1169):     at android.app.Activity.startActivityForResult(Activity.java:2827)
10-26 20:41:57.906: W/System.err(1169):     at android.app.Activity.startActivity(Activity.java:2933)
10-26 20:41:57.916: W/System.err(1169):     at agr.mobile.service.LoginClientServiceThread.run(LoginClientServiceThread.java:76)
10-26 20:41:57.916: W/System.err(1169):     at agr.mobile.app.AgrUserLoginHome.onClick(AgrUserLoginHome.java:59)
10-26 20:41:57.916: W/System.err(1169):     at android.view.View.performClick(View.java:2485)
10-26 20:41:57.916: W/System.err(1169):     at android.view.View$PerformClick.run(View.java:9080)
10-26 20:41:57.916: W/System.err(1169):     at android.os.Handler.handleCallback(Handler.java:587)
10-26 20:41:57.916: W/System.err(1169):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-26 20:41:57.916: W/System.err(1169):     at android.os.Looper.loop(Looper.java:123)
10-26 20:41:57.916: W/System.err(1169):     at android.app.ActivityThread.main(ActivityThread.java:3683)
10-26 20:41:57.916: W/System.err(1169):     at java.lang.reflect.Method.invokeNative(Native Method)
10-26 20:41:57.916: W/System.err(1169):     at java.lang.reflect.Method.invoke(Method.java:507)
10-26 20:41:57.916: W/System.err(1169):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
10-26 20:41:57.926: W/System.err(1169):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
10-26 20:41:57.926: W/System.err(1169):     at dalvik.system.NativeStart.main(Native Method)

Upvotes: 2

Views: 6869

Answers (1)

Raghav Sood
Raghav Sood

Reputation: 82533

You say that LoginClientServiceThread isn't an Activity, yet you extend Activity. Don't do this. If you want to launch an Activity from a non-Activity class, use the following:

intent=new Intent(context,TrainerAccessScreen.class);
intent.putExtra("reading",str);
if(null!=intent)
{
    Toast.makeText(context, "Working",  
    Toast.LENGTH_LONG).show();
    context.startActivity(intent);
}

You're getting a NullPointerException as you're calling startActivity() from the this instance of LoginClientServiceThread. However, as you haven't launched and created that Activity as a normal Activity, you have a null reference. So your final code will look like:

public class LoginClientServiceThread implements Runnable{

    private Intent intent;
    private String username,password;
    private Context context;
    public LoginClientServiceThread(Context cont,String user,String pass)
    {
        username=user;
        password=pass;
        context=cont;
    }

    public void run() {
        try
        {
            try
            {
                JSONObject json = new JSONObject();
                json.put("username", username);
                json.put("password", password);

                DefaultHttpClient httpClient = new DefaultHttpClient();
                URI uri = new URI("http://10.0.2.2:80/BairyApp/Login.svc");

                HttpPost httppost = new HttpPost(uri + "/verifyLogin");
                httppost.setHeader("Accept", "application/json");
                httppost.setHeader("Content-type", "application/json; charset=utf-8");

                HttpResponse response = httpClient.execute(httppost);
                HttpEntity responseEntity = response.getEntity();

                long intCount = responseEntity.getContentLength();
                char[] buffer = new char[(int)intCount];
                InputStream stream = responseEntity.getContent();
                InputStreamReader reader = new InputStreamReader(stream, "UTF-8");

                try
                {
                    reader.read(buffer);
                    String str = new String(buffer);
                    intent=new Intent(context,TrainerAccessScreen.class);
                    intent.putExtra("reading",str);
                    if(null!=intent)
                    {
                        Toast.makeText(context, "Working",  
                            Toast.LENGTH_LONG).show();
                        //startActivity shows as null here
                        context.startActivity(intent);
                    }
                    Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                    Toast.makeText(context, "IOException:"+e.getMessage(),  
                        Toast.LENGTH_LONG).show();
                }
                finally
                {
                    stream.close();
                }

            }
            catch(URISyntaxException urise)
            {
                urise.printStackTrace();
                Toast.makeText(context, "urise", Toast.LENGTH_LONG).show();
            }
            catch(ClientProtocolException cpe)
            {
                cpe.printStackTrace();
                Toast.makeText(context, "cpe", Toast.LENGTH_LONG).show();
            }
            catch(IOException ioe)
            {
                ioe.printStackTrace();
                Toast.makeText(context, "ioe", Toast.LENGTH_LONG).show();
            }
        }
        catch(Exception e)
        {
            Toast.makeText(context, "Execution failed: "+e.getMessage(), 
                Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }
}

You don't need to extend Activity at all in the second class.

Upvotes: 4

Related Questions