2016-04-27 78 views
0

我有一个通过改进连接到API的android应用,如果我按回退按钮返回到登录活动,如果我尝试重新登录,则成功登录在再次,该应用程序崩溃,并给我一个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()是

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); 
    } 
} 

的NullPointerException异常被在

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

首先抛出,它得到的数据n成功地记录在,但是当我使用后退按钮ñ尝试再次登录它崩溃。

+1

无法判断您的后端调用返回的内容。放置导致NPE并在调试模式下运行的断点。然后只是检查为什么结果为空。也许某种保护措施太频繁地调用登录。尝试用Postman或类似工具重新创建这种情况。 – 3mpty

+0

您是否清除点击后退按钮的所有数据? @Light –

+0

我并未清除任何数据。或者当我回去时必须重新创建活动? @Partha – Light

回答

1

调试器是你的答案 - 是否会回来时,你不会丢失任何数据 - 活动课的地方,也许你存储登录PARAMS,但你无法正常保存实例状态和第二请求被触发没有必要的数据。在第一次和第二次调用请求之前检查变量的状态。

在这种情况下,总是最好的选择是放置断点并逐步触发你的工作。如果没有调试技能,你不能成为优秀的开发人员。

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(); 
     } 
    }); 
} 
相关问题