Reputation: 107
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
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