2012-10-26 47 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

很高興我能幫助:) –

相關問題