当我尝试重新登录时,Android应用程序崩溃了

时间:2016-04-27 12:54:12

标签: java android retrofit

我有一个通过改造连接到API的Android应用程序,我已经成功登录,如果我按回按钮再次返回登录活动,如果我再次尝试重新登录,应用程序崩溃并给予我是一个NullPointerException。

此处的连接代码

    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成功登录,但是当我使用后退按钮时,尝试再次登录它会崩溃。

2 个答案:

答案 0 :(得分:0)

调试器是你的答案 - 检查你回去时是否没有丢失任何数据 - 也许你在活动类的某个地方存储登录参数但是你没有正确保存实例状态而没有必要的数据就触发了第二个请求。在第一次和第二次调用请求之前检查变量状态。

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

答案 1 :(得分:0)

我认为由于某种原因,当我使用后退按钮导航到父活动时,数据对象没有收到结果。所以我使用了if条件使它获得所需的数据。

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