2012-10-26 113 views
1

对于我的生活,我似乎无法找出我的代码有什么问题。在startActivity的NullPointerException(意图)

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方法返回一个空。我知道这一点,因为如果我将意图上下文更改为“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) 
+2

请把logcat输出 – hshed

+0

你有清单中有这个类吗? –

+0

LoginClientServiceThread.java文件不是活动文件。这只是一个普通的java类,旨在执行活动类以外的服务操作 – Zubair

回答

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因为你从LoginClientServiceThreadthis实例调用startActivity()。但是,由于您尚未启动并将该Activity创建为正常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

+0

谢谢!作品像一个魅力:D – Zubair

+0

很高兴我能帮助:) –

相关问题