对于我的生活,我似乎无法找出我的代码有什么问题。
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();
}
}
}
我确定startActivity方法返回null。我知道这是因为如果我将intent上下文更改为“this”,则直接位于其下方的IOException中的Toast不会显示。
有什么想法吗?哦顺便说一下,我是初学者,所以我知道代码看起来很糟糕
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)
答案 0 :(得分:4)
您说LoginClientServiceThread
不是Activity
,但您延伸Activity
。不要这样做。如果要从非活动类启动Activity
,请使用以下命令:
intent=new Intent(context,TrainerAccessScreen.class);
intent.putExtra("reading",str);
if(null!=intent)
{
Toast.makeText(context, "Working",
Toast.LENGTH_LONG).show();
context.startActivity(intent);
}
当您从NullPointerException
startActivity()
实例调用this
时,您收到了LoginClientServiceThread
。但是,由于您尚未启动并将该Activity创建为普通活动,因此您具有空引用。所以你的最终代码如下:
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();
}
}
}
您不需要在第二节课中扩展Activity
。