2016-04-27 22 views
0

APIに接続されたアンドロイドアプリがあり、正常にログインしています。ログインボタンを押してログインアクティビティに戻ります。再び、アプリケーションがクラッシュし、私にNullPointerExceptionを与えます。再ログインしようとするとAndroidアプリがクラッシュする

は、ここで接続コード

private void loginUser(String email, String password) { 

    UnifyAuthenticationApiInterface service = this.client.create(UnifyAuthenticationApiInterface.class); 
    Call<UnifyAuthenticationApiResponse> call = service.staffLogin(email, password); 

    call.enqueue(new Callback<UnifyAuthenticationApiResponse>() { 
     @Override 
     public void onResponse(Call<UnifyAuthenticationApiResponse> call, 
           Response<UnifyAuthenticationApiResponse> response) { 

      UnifyAuthenticationApiResponse result = response.body(); 
      School school = new School(); 
      com.peterstev.unify.login.Data data = result.getData(); 
      mySchoolsList = new ArrayList<School>(); 
      mySchoolsList = data.getSchools(); 
      staff = data.getStaff(); 

      gotoHomeActivity(); 

     } 

     @Override 
     public void onFailure(Call<UnifyAuthenticationApiResponse> call, Throwable t) { 
      progressDialog.dismiss(); 
      Toast.makeText(MainActivity.this, "Login Failed @ onFailure", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 

だとgoToHomeActivity()はNullPointerExceptionが最初に

com.peterstev.unify.login.Data data = result.getData(); 

で投げます

private void gotoHomeActivity() { 
    progressDialog.dismiss(); 
    if (mySchoolsList.size() > 1) { 
     schoolsListView = new ListView(MainActivity.this); 
     schoolsArrayAdapter = new SchoolListAdapter(MainActivity.this, android.R.layout.simple_list_item_1, mySchoolsList); 
     schoolsListView.setAdapter(schoolsArrayAdapter); 

     dialog = new Dialog(MainActivity.this); 
     dialog.setContentView(schoolsListView); 
     dialog.setTitle("Welcome " + staff.getFullName()); 
     dialog.show(); 

    } else { 
     Intent intent = new Intent(MainActivity.this, NavMainActivity.class); 
     startActivity(intent); 
    } 
} 

あり、それは、データのn個の正常ログを取得しますしかし、私はバックボタンを使用してnをもう一度ログインしようとするとクラッシュします。

+1

バックエンドコールが返す内容を知ることはできません。ブレークポイントをNPEの行に配置し、デバッグモードで実行します。次にresultがnullであることを確認してください。おそらく、ログインを頻繁に呼び出すための何らかの保護手段でしょう。郵便配達員または同様のツールを使用してこの状況を再現してください。 – 3mpty

+0

戻るボタンをクリックしてすべてのデータを消去していますか? @Light –

+0

私はデータをクリアしません。または私が戻ったときにアクティビティを再作成する必要がありますか? { "スタッフ":{ "school_id": "xxxxxxxxxxxxxxxxxxxx"、 "電子メール": "xxxxxxxxxxxxxxxxxxxx"、 "api_token":「xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx郵便配達と3mpty @ @Partha – Light

答えて

1

デバッガが回答です - 戻ってきたときにデータが失われていないかどうかを確認してください - おそらくアクティビティクラスのどこかにログインパラメータを保存していますが、 。あなたの要求を1回目と2回目に呼び出す直前に、変数の状態をチェックしてください。

このような状況では、常にブレークポイントを配置し、作業をステップごとにトリガーするのが最良の方法です。あなたはデバッガのスキルがなくても良い開発者になることはできません。

0

何らかの理由で、私が親アクティビティに戻るために戻るボタンを使用したときにデータオブジェクトが結果を受け取っていないと思います。だから私は使用し、それが必要なデータを取得する条件。

private void loginUser(String email, String password) { 

    UnifyAuthenticationApiInterface service = this.client.create(UnifyAuthenticationApiInterface.class); 
    Call<UnifyAuthenticationApiResponse> call = service.staffLogin(email, password); 

    call.enqueue(new Callback<UnifyAuthenticationApiResponse>() { 
     @Override 
     public void onResponse(Call<UnifyAuthenticationApiResponse> call, 
           Response<UnifyAuthenticationApiResponse> response) { 

      if(response.isSuccessful()) { 

       UnifyAuthenticationApiResponse result = response.body(); 
       School school = new School(); 
       data = result.getData(); 
       if(data == null) { 
        try{ 
         this.onResponse(call, response); 
        }catch(NullPointerException NPE){ 
         Log.d("NPE", NPE.getMessage()); 
        } 
       } 
       mySchoolsList = new ArrayList<School>(); 
       mySchoolsList = data.getSchools(); 
       staff = data.getStaff(); 

       gotoHomeActivity(); 
      } 
     } 

     @Override 
     public void onFailure(Call<UnifyAuthenticationApiResponse> call, Throwable t) { 
      progressDialog.dismiss(); 
      Toast.makeText(MainActivity.this, "Login Failed @ onFailure", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 
関連する問題